opts <- options(knitr.kable.NA = "")

1 Data overview

All EDGE samples excluded
OTU tables rarefied (16S: 9,048 & ITS: 10,116 seqs/sample)
‘Taxa’ are OTUs

AllG (All Grasses)

Bacterial & Archaeal Dataset:

Bac.AllG
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 23156 taxa and 533 samples ]
sample_data() Sample Data:       [ 533 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 23156 taxa by 6 taxonomic ranks ]


Fungal Dataset:

Fun.AllG
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 6749 taxa and 509 samples ]
sample_data() Sample Data:       [ 509 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 6749 taxa by 7 taxonomic ranks ]


ANGE (Andropogon gerardii / Big bluestem)

Bacterial & Archaeal Dataset:

Bac.ANGE
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 14268 taxa and 106 samples ]
sample_data() Sample Data:       [ 106 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 14268 taxa by 6 taxonomic ranks ]


Fungal Dataset:

Fun.ANGE
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 2985 taxa and 98 samples ]
sample_data() Sample Data:       [ 98 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 2985 taxa by 7 taxonomic ranks ]


BOER (B. eriopoda / Black grama)

Bacterial & Archaeal Dataset:

Bac.BOER
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 8374 taxa and 84 samples ]
sample_data() Sample Data:       [ 84 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 8374 taxa by 6 taxonomic ranks ]


Fungal Dataset:

Fun.BOER
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 1662 taxa and 78 samples ]
sample_data() Sample Data:       [ 78 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 1662 taxa by 7 taxonomic ranks ]


BOGR (B. gracilis / Blue grama)

Bacterial & Archaeal Dataset:

Bac.BOGR
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 10108 taxa and 86 samples ]
sample_data() Sample Data:       [ 86 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 10108 taxa by 6 taxonomic ranks ]


Fungal Dataset:

Fun.BOGR
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 2668 taxa and 92 samples ]
sample_data() Sample Data:       [ 92 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 2668 taxa by 7 taxonomic ranks ]


BUDA (Bouteloua dactyloides / Buffalograss)

Bacterial & Archaeal Dataset:

Bac.BUDA
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 11048 taxa and 83 samples ]
sample_data() Sample Data:       [ 83 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 11048 taxa by 6 taxonomic ranks ]


Fungal Dataset:

Fun.BUDA
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 2369 taxa and 80 samples ]
sample_data() Sample Data:       [ 80 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 2369 taxa by 7 taxonomic ranks ]


SCSC (Schizachyrium scoparium / Little bluestem)

Bacterial & Archaeal Dataset:

Bac.SCSC
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 17568 taxa and 174 samples ]
sample_data() Sample Data:       [ 174 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 17568 taxa by 6 taxonomic ranks ]


Fungal Dataset:

Fun.SCSC
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 4347 taxa and 161 samples ]
sample_data() Sample Data:       [ 161 samples by 39 sample variables ]
tax_table()   Taxonomy Table:    [ 4347 taxa by 7 taxonomic ranks ]


2 NMDS By Grass Host


- ANGE (Andropogon gerardii / Big bluestem)
- SCSC (Schizachyrium scoparium / Little bluestem)
- BOER (B. eriopoda / Black grama)
- BOGR (B. gracilis / Blue grama)
- BUDA (Bouteloua dactyloides / Buffalograss)

NMDS plots of all samples, colored by grass host
NMDS plots of all samples, colored by grass host
knitr::kable((as.data.frame(subset(adonis.out.array_predGrass, 
                    comm==comm.names.by.grass[1])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.AllG.Grass 4 18.6 0.132 20.12 0.001
Bac.AllG.Residual 528 122.2 0.868
Bac.AllG.Total 532 140.8 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predGrass, 
                    comm==comm.names.by.grass[2])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.AllG.Grass 4 13.2 0.064 8.67 0.001
Fun.AllG.Residual 504 192.5 0.936
Fun.AllG.Total 508 205.7 1.000

3 Subset by Grass Host

3.1 Influence of discrete latitudinal bins

AllG (All Grasses)

NMDS plots of all samples, colored by latitudinal bin
NMDS plots of all samples, colored by latitudinal bin
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[1])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.AllG.Bin 3 7.9 0.056 10.48 0.001
Bac.AllG.Residual 529 132.9 0.944
Bac.AllG.Total 532 140.8 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[2])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.AllG.Bin 3 11.3 0.055 9.79 0.001
Fun.AllG.Residual 505 194.4 0.945
Fun.AllG.Total 508 205.7 1.000

ANGE (Andropogon gerardii / Big bluestem)

NMDS plots of ANGE host-associated samples, colored by latitudinal bin
NMDS plots of ANGE host-associated samples, colored by latitudinal bin
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[3])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.ANGE.Bin 3 4.4 0.157 6.33 0.001
Bac.ANGE.Residual 102 23.8 0.843
Bac.ANGE.Total 105 28.2 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[4])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.ANGE.Bin 3 6.4 0.174 6.59 0.001
Fun.ANGE.Residual 94 30.6 0.826
Fun.ANGE.Total 97 37.0 1.000

BOER (B. eriopoda / Black grama)

NMDS plots of BOER host-associated samples, colored by latitudinal bin
NMDS plots of BOER host-associated samples, colored by latitudinal bin
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[5])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.BOER.Bin 3 6 0.354 14.58 0.001
Bac.BOER.Residual 80 11 0.646
Bac.BOER.Total 83 17 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[6])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.BOER.Bin 3 5.4 0.194 5.94 0.001
Fun.BOER.Residual 74 22.3 0.806
Fun.BOER.Total 77 27.7 1.000

BOGR (B. gracilis / Blue grama)

NMDS plots of BOGR host-associated samples, colored by latitudinal bin
NMDS plots of BOGR host-associated samples, colored by latitudinal bin
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[7])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.BOGR.Bin 3 2.9 0.168 5.51 0.001
Bac.BOGR.Residual 82 14.3 0.832
Bac.BOGR.Total 85 17.2 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[8])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.BOGR.Bin 3 4.0 0.126 4.24 0.001
Fun.BOGR.Residual 88 27.7 0.874
Fun.BOGR.Total 91 31.8 1.000

BUDA (Bouteloua dactyloides / Buffalograss)

NMDS plots of BUDA host-associated samples, colored by latitudinal bin
NMDS plots of BUDA host-associated samples, colored by latitudinal bin
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[9])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.BUDA.Bin 3 2.6 0.171 5.45 0.001
Bac.BUDA.Residual 79 12.4 0.829
Bac.BUDA.Total 82 15.0 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[10])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.BUDA.Bin 3 4.3 0.14 4.11 0.001
Fun.BUDA.Residual 76 26.5 0.86
Fun.BUDA.Total 79 30.8 1.00

SCSC (Schizachyrium scoparium / Little bluestem)

NMDS plots of SCSC host-associated samples, colored by latitudinal bin
NMDS plots of SCSC host-associated samples, colored by latitudinal bin
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[11])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.SCSC.Bin 3 4.0 0.09 5.58 0.001
Bac.SCSC.Residual 170 40.8 0.91
Bac.SCSC.Total 173 44.8 1.00
knitr::kable((as.data.frame(subset(adonis.out.array_predBin, 
                    comm==comm.names.by.grass[12])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.SCSC.Bin 3 5.3 0.081 4.62 0.001
Fun.SCSC.Residual 157 60.0 0.919
Fun.SCSC.Total 160 65.3 1.000


3.2 Influence of discrete longitudinal gradients

AllG (All Grasses)

NMDS plots of all samples, colored by longitudinal gradient
NMDS plots of all samples, colored by longitudinal gradient
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[1])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.AllG.Gradient 2 17.5 0.124 37.57 0.001
Bac.AllG.Residual 530 123.3 0.876
Bac.AllG.Total 532 140.8 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[2])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.AllG.Gradient 2 10.4 0.05 13.45 0.001
Fun.AllG.Residual 506 195.3 0.95
Fun.AllG.Total 508 205.7 1.00

ANGE (Andropogon gerardii / Big bluestem)

NMDS plots of ANGE host-associated samples, colored by longitudinal gradient
NMDS plots of ANGE host-associated samples, colored by longitudinal gradient
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[3])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.ANGE.Gradient 1 2.8 0.1 11.62 0.001
Bac.ANGE.Residual 104 25.4 0.9
Bac.ANGE.Total 105 28.2 1.0
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[4])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.ANGE.Gradient 1 1.8 0.05 5.04 0.001
Fun.ANGE.Residual 96 35.2 0.95
Fun.ANGE.Total 97 37.0 1.00

BOER (B. eriopoda / Black grama)

NMDS plots of BOER host-associated samples, colored by longitudinal gradient






[NA on stats here - only 1 factor level]












# knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
#                     comm==comm.names.by.grass[5])))[,1:5], "simple", 
#              digits =c (0,1,3,2,3), 
#              align = 'c')

# knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
#                     comm==comm.names.by.grass[6])))[,1:5], "simple", 
#              digits =c (0,1,3,2,3), 
#              align = 'c')

BOGR (B. gracilis / Blue grama)

NMDS plots of BOGR host-associated samples, colored by longitudinal gradient
NMDS plots of BOGR host-associated samples, colored by longitudinal gradient
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[7])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.BOGR.Gradient 2 2.6 0.152 7.45 0.001
Bac.BOGR.Residual 83 14.5 0.848
Bac.BOGR.Total 85 17.2 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[8])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.BOGR.Gradient 2 3.5 0.109 5.46 0.001
Fun.BOGR.Residual 89 28.3 0.891
Fun.BOGR.Total 91 31.8 1.000

BUDA (Bouteloua dactyloides / Buffalograss)

NMDS plots of BUDA host-associated samples, colored by longitudinal gradient
NMDS plots of BUDA host-associated samples, colored by longitudinal gradient
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[9])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.BUDA.Gradient 2 2.6 0.172 8.3 0.001
Bac.BUDA.Residual 80 12.4 0.828
Bac.BUDA.Total 82 15.0 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[10])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.BUDA.Gradient 2 3.0 0.097 4.14 0.001
Fun.BUDA.Residual 77 27.8 0.903
Fun.BUDA.Total 79 30.8 1.000

SCSC (Schizachyrium scoparium / Little bluestem)

NMDS plots of SCSC host-associated samples, colored by longitudinal gradient
NMDS plots of SCSC host-associated samples, colored by longitudinal gradient
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[11])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Bac.SCSC.Gradient 2 5.9 0.131 12.93 0.001
Bac.SCSC.Residual 171 38.9 0.869
Bac.SCSC.Total 173 44.8 1.000
knitr::kable((as.data.frame(subset(adonis.out.array_predGradient, 
                    comm==comm.names.by.grass[12])))[,1:5], "simple", 
             digits =c (0,1,3,2,3), 
             align = 'c')
Df SumOfSqs R2 F Pr(>F)
Fun.SCSC.Gradient 2 3.4 0.052 4.37 0.001
Fun.SCSC.Residual 158 61.8 0.948
Fun.SCSC.Total 160 65.3 1.000


LS0tCnRpdGxlOiAiKipLU1UgcGFpcmVkIGFtcGxpY29uIGNvbW11bml0eSBvcmRpbmF0aW9ucyoqIgpzdWJ0aXRsZTogIkNvbXBhcmF0aXZlIE5NRFMgcGxvdHMgb2YgMTZTIGFuZCBJVFMgZGF0YSAoRURHRSBzYW1wbGVzIGV4Y2x1ZGVkKSwgdXBkYXRlZCB0byBpbmNsdWRlIGFkb25pczIgYW5hbHlzZXMgKHBlcm1BTk9WQSBieSBtZXRhZGF0YSkiCmF1dGhvcjogIktlbGxpIEZlZXNlciIKZGF0ZTogJzIwMjMtMTAtMDInCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZl9wcmludDogcGFnZWQKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBjc3M6IHN0eWxlcy5jc3MKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY3NzOiB0ZXN0LmNzcwogICAgZmlnX2hlaWdodDogNAogICAgZmlnX3dpZHRoOiA1LjUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNzczogc3R5bGVzLmNzcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGZpZy5jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKXAo8ZGl2IGNsYXNzPSJob21lbGluayI+CjxhIGhyZWY9Imh0dHBzOi8va2VsbGlmZWVzZXIuZ2l0aHViLmlvL2tzdS1wYWlyZWQtYW1wbGljb24td29ya2Zsb3cvaW5kZXguaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5CYWNrIHRvIEhvbWU8L2E+CjwvZGl2PgoKCmBgYHtyfQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikKYGBgCgpgYGB7ciBMQU5MIHByb3hpZXMsIGV2YWw9VCwgaW5jbHVkZT1GQUxTRX0KIyBMQU5MIHByb3hpZXMKU3lzLnNldGVudignSFRUUF9QUk9YWSc9J2h0dHA6Ly9wcm94eW91dC5sYW5sLmdvdjo4MDgwJykKU3lzLnNldGVudignSFRUUFNfUFJPWFknPSdodHRwOi8vcHJveHlvdXQubGFubC5nb3Y6ODA4MCcpCmBgYAoKYGBge3IgbG9hZCBwYWNrYWdlcywgZXZhbD1ULCBpbmNsdWRlPUYscmVzdWx0cz0naGlkZScsIGVycm9yPUZ9CmxpYnJhcnkoImdncGxvdDIiKTsgcGFja2FnZVZlcnNpb24oImdncGxvdDIiKSAj4oCYMy40LjTigJkKbGlicmFyeSgidmVnYW4iKTsgcGFja2FnZVZlcnNpb24oInZlZ2FuIikgIyAjIOKAmDIuNi404oCZCmxpYnJhcnkoInBoeWxvc2VxIik7IHBhY2thZ2VWZXJzaW9uKCJwaHlsb3NlcSIpICPigJgxLjQ0LjDigJkKbGlicmFyeSgic2NhbGVzIik7IHBhY2thZ2VWZXJzaW9uKCJzY2FsZXMiKSAj4oCYMS4yLjHigJkKbGlicmFyeSgic3dhdGNoZXMiKTsgcGFja2FnZVZlcnNpb24oInN3YXRjaGVzIikgI+KAmDAuNS4w4oCZCmxpYnJhcnkoImdnc2NpIik7IHBhY2thZ2VWZXJzaW9uKCJnZ3NjaSIpICPigJgzLjAuMOKAmQpsaWJyYXJ5KCJnZ3B1YnIiKTsgcGFja2FnZVZlcnNpb24oImdncHViciIpICPigJgwLjYuMOKAmQpsaWJyYXJ5KCJ2aXJpZGlzIik7IHBhY2thZ2VWZXJzaW9uKCJ2aXJpZGlzIikgI+KAmDAuNi404oCZCmxpYnJhcnkoIlJDb2xvckJyZXdlciIpOyBwYWNrYWdlVmVyc2lvbigiUkNvbG9yQnJld2VyIikgI+KAmDEuMS4z4oCZCmxpYnJhcnkoImNvd3Bsb3QiKTsgcGFja2FnZVZlcnNpb24oImNvd3Bsb3QiKSAj4oCYMS4xLjHigJkKbGlicmFyeSgiZHBseXIiKTsgcGFja2FnZVZlcnNpb24oImRwbHlyIikgI+KAmDEuMS4z4oCZCmxpYnJhcnkoImtuaXRyIik7IHBhY2thZ2VWZXJzaW9uKCJrbml0ciIpICPigJgxLjQ04oCZCgogICMgbGlicmFyeShCaW9jTWFuYWdlcikKICAjIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJtaWNyb2Jpb21lIikKCmxpYnJhcnkoIm1pY3JvYmlvbWUiKTsgcGFja2FnZVZlcnNpb24oIm1pY3JvYmlvbWUiKSAj4oCYMS4yMi4w4oCZCgpzb3VyY2UoImtzdV9jb2xvcnMuUiIpCmBgYAoKIyBTZXQtdXAgey5oaWRkZW4gLnVubGlzdGVkIC51bm51bWJlcmVkfQoKIyMgSW1wb3J0IGNsZWFuIE9UVSB0YWJsZXMgey51bmxpc3RlZH0KCmBgYHtyIHJlYWRpbiBjbGVhbiByZHMgQWxsRywgZWNobz1GLCBldmFsPVR9CkJhYzwtcmVhZFJEUyhmaWxlID0gIi4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWNBcmNoX21pbjJfcmFyZTkwNDhfdjEucmRzIikKICAjIG90dV90YWJsZSgpICAgT1RVIFRhYmxlOiAgICAgICAgIFsgMjMxNTYgdGF4YSBhbmQgNTMzIHNhbXBsZXMgXQogICMgc2FtcGxlX2RhdGEoKSBTYW1wbGUgRGF0YTogICAgICAgWyA1MzMgc2FtcGxlcyBieSAzOSBzYW1wbGUgdmFyaWFibGVzIF0KRnVuPC1yZWFkUkRTKGZpbGUgPSAiLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0Z1bl9taW4yX3JhcmUxMDExNl92Mi5yZHMiKQogICMgb3R1X3RhYmxlKCkgICBPVFUgVGFibGU6ICAgICAgICAgWyA2NzQ5IHRheGEgYW5kIDUwOSBzYW1wbGVzIF0KICAjIHNhbXBsZV9kYXRhKCkgU2FtcGxlIERhdGE6ICAgICAgIFsgNTA5IHNhbXBsZXMgYnkgMzkgc2FtcGxlIHZhcmlhYmxlcyBdCgpCYWMuQWxsRzwtQmFjCkZ1bi5BbGxHPC1GdW4KYGBgCgpgYGB7ciByZWFkaW4gY2xlYW4gcmRzIHN1YnNldHRlZEcsIGluY2x1ZGU9RiwgZXZhbD1ULCBjYWNoZT1UUlVFfQpCYWMuQU5HRTwtcmVhZFJEUyhmaWxlID0gIi4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWNBcmNoX21pbjJfcmFyZTkwNDhfbm9FREdFX0FOR0VfdjEucmRzIikKRnVuLkFOR0U8LXJlYWRSRFMoZmlsZSA9ICIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuX21pbjJfcmFyZTEwMTE2X25vRURHRV9BTkdFX3YxLnJkcyIpCgpCYWMuQk9FUjwtcmVhZFJEUyhmaWxlID0gIi4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWNBcmNoX21pbjJfcmFyZTkwNDhfbm9FREdFX0JPRVJfdjEucmRzIikKRnVuLkJPRVI8LXJlYWRSRFMoZmlsZSA9ICIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuX21pbjJfcmFyZTEwMTE2X25vRURHRV9CT0VSX3YxLnJkcyIpCgpCYWMuQk9HUjwtcmVhZFJEUyhmaWxlID0gIi4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWNBcmNoX21pbjJfcmFyZTkwNDhfbm9FREdFX0JPR1JfdjEucmRzIikKRnVuLkJPR1I8LXJlYWRSRFMoZmlsZSA9ICIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuX21pbjJfcmFyZTEwMTE2X25vRURHRV9CT0dSX3YxLnJkcyIpCgpCYWMuQlVEQTwtcmVhZFJEUyhmaWxlID0gIi4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWNBcmNoX21pbjJfcmFyZTkwNDhfbm9FREdFX0JVREFfdjEucmRzIikKRnVuLkJVREE8LXJlYWRSRFMoZmlsZSA9ICIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuX21pbjJfcmFyZTEwMTE2X25vRURHRV9CVURBX3YxLnJkcyIpCgpCYWMuU0NTQzwtcmVhZFJEUyhmaWxlID0gIi4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWNBcmNoX21pbjJfcmFyZTkwNDhfbm9FREdFX1NDU0NfdjEucmRzIikKRnVuLlNDU0M8LXJlYWRSRFMoZmlsZSA9ICIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuX21pbjJfcmFyZTEwMTE2X25vRURHRV9TQ1NDX3YxLnJkcyIpCmBgYAoKYGBge3IgbWFrZSBuYW1lIGxpc3Qgb2YgY29tbXMsIGluY2x1ZGU9RkFMU0UsIGV2YWw9VFJVRX0KY29tbS5uYW1lcy5ieS5ncmFzcyA8LSBjKCJCYWMuQWxsRyIsIkZ1bi5BbGxHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJCYWMuQU5HRSIsICJGdW4uQU5HRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjLkJPRVIiLCJGdW4uQk9FUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjLkJPR1IiLCJGdW4uQk9HUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjLkJVREEiLCJGdW4uQlVEQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjLlNDU0MiLCJGdW4uU0NTQyIpCmBgYAoKXAoKIyMgT3JkaW5hdGUgYWxsIGdyYXNzZXMgYW5kIGJ5LWhvc3QgKHRyeWluZyBrIDEtNykgey51bmxpc3RlZH0KCmBgYHtyIEFsbEcgb3JkLCBldmFsPUYsIGluY2x1ZGU9Rn0KQmFjLkFsbEcuazEub3JkID0gb3JkaW5hdGUoQmFjLCAiTk1EUyIsICJicmF5Iiwgaz0xLCBtYXhpdD01MDApCkJhYy5BbGxHLmsyLm9yZCA9IG9yZGluYXRlKEJhYywgIk5NRFMiLCAiYnJheSIsIGs9MiwgbWF4aXQ9NTAwKQpCYWMuQWxsRy5rMy5vcmQgPSBvcmRpbmF0ZShCYWMsICJOTURTIiwgImJyYXkiLCBrPTMsIG1heGl0PTUwMCkKQmFjLkFsbEcuazQub3JkID0gb3JkaW5hdGUoQmFjLCAiTk1EUyIsICJicmF5Iiwgaz00LCBtYXhpdD01MDApCkJhYy5BbGxHLms1Lm9yZCA9IG9yZGluYXRlKEJhYywgIk5NRFMiLCAiYnJheSIsIGs9NSwgbWF4aXQ9NTAwKQpCYWMuQWxsRy5rNi5vcmQgPSBvcmRpbmF0ZShCYWMsICJOTURTIiwgImJyYXkiLCBrPTYsIG1heGl0PTUwMCkKQmFjLkFsbEcuazcub3JkID0gb3JkaW5hdGUoQmFjLCAiTk1EUyIsICJicmF5Iiwgaz03LCBtYXhpdD01MDApCgpGdW4uQWxsRy5rMS5vcmQgPSBvcmRpbmF0ZShGdW4sICJOTURTIiwgImJyYXkiLCBrPTEsIG1heGl0PTUwMCkKRnVuLkFsbEcuazIub3JkID0gb3JkaW5hdGUoRnVuLCAiTk1EUyIsICJicmF5Iiwgaz0yLCBtYXhpdD01MDApCkZ1bi5BbGxHLmszLm9yZCA9IG9yZGluYXRlKEZ1biwgIk5NRFMiLCAiYnJheSIsIGs9MywgbWF4aXQ9NTAwKQpGdW4uQWxsRy5rNC5vcmQgPSBvcmRpbmF0ZShGdW4sICJOTURTIiwgImJyYXkiLCBrPTQsIG1heGl0PTUwMCkKRnVuLkFsbEcuazUub3JkID0gb3JkaW5hdGUoRnVuLCAiTk1EUyIsICJicmF5Iiwgaz01LCBtYXhpdD01MDApCkZ1bi5BbGxHLms2Lm9yZCA9IG9yZGluYXRlKEZ1biwgIk5NRFMiLCAiYnJheSIsIGs9NiwgbWF4aXQ9NTAwKQpGdW4uQWxsRy5rNy5vcmQgPSBvcmRpbmF0ZShGdW4sICJOTURTIiwgImJyYXkiLCBrPTcsIG1heGl0PTUwMCkKYGBgCgpgYGB7ciBBTkdFIG9yZCwgZXZhbD1GLCBpbmNsdWRlPUZ9CkJhYy5BTkdFLmsxLm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz0xLCBtYXhpdD01MDApCkJhYy5BTkdFLmsyLm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz0yLCBtYXhpdD01MDApCkJhYy5BTkdFLmszLm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz0zLCBtYXhpdD01MDApCkJhYy5BTkdFLms0Lm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz00LCBtYXhpdD01MDApCkJhYy5BTkdFLms1Lm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz01LCBtYXhpdD01MDApCkJhYy5BTkdFLms2Lm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz02LCBtYXhpdD01MDApCkJhYy5BTkdFLms3Lm9yZCA9IG9yZGluYXRlKEJhYy5BTkdFLCAiTk1EUyIsICJicmF5Iiwgaz03LCBtYXhpdD01MDApCgpGdW4uQU5HRS5rMS5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9MSwgbWF4aXQ9NTAwKQpGdW4uQU5HRS5rMi5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9MiwgbWF4aXQ9NTAwKQpGdW4uQU5HRS5rMy5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9MywgbWF4aXQ9NTAwKQpGdW4uQU5HRS5rNC5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9NCwgbWF4aXQ9NTAwKQpGdW4uQU5HRS5rNS5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9NSwgbWF4aXQ9NTAwKQpGdW4uQU5HRS5rNi5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9NiwgbWF4aXQ9NTAwKQpGdW4uQU5HRS5rNy5vcmQgPSBvcmRpbmF0ZShGdW4uQU5HRSwgIk5NRFMiLCAiYnJheSIsIGs9NywgbWF4aXQ9NTAwKQpgYGAKCmBgYHtyIEJPRVIgb3JkLCBldmFsPUYsIGluY2x1ZGU9Rn0KQmFjLkJPRVIuazEub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTEsIG1heGl0PTUwMCkKQmFjLkJPRVIuazIub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTIsIG1heGl0PTUwMCkKQmFjLkJPRVIuazMub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTMsIG1heGl0PTUwMCkKQmFjLkJPRVIuazQub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTQsIG1heGl0PTUwMCkKQmFjLkJPRVIuazUub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTUsIG1heGl0PTUwMCkKQmFjLkJPRVIuazYub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTYsIG1heGl0PTUwMCkKQmFjLkJPRVIuazcub3JkID0gb3JkaW5hdGUoQmFjLkJPRVIsICJOTURTIiwgImJyYXkiLCBrPTcsIG1heGl0PTUwMCkKCkZ1bi5CT0VSLmsxLm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz0xLCBtYXhpdD01MDApCkZ1bi5CT0VSLmsyLm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz0yLCBtYXhpdD01MDApCkZ1bi5CT0VSLmszLm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz0zLCBtYXhpdD01MDApCkZ1bi5CT0VSLms0Lm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz00LCBtYXhpdD01MDApCkZ1bi5CT0VSLms1Lm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz01LCBtYXhpdD01MDApCkZ1bi5CT0VSLms2Lm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz02LCBtYXhpdD01MDApCkZ1bi5CT0VSLms3Lm9yZCA9IG9yZGluYXRlKEZ1bi5CT0VSLCAiTk1EUyIsICJicmF5Iiwgaz03LCBtYXhpdD01MDApCmBgYAoKYGBge3IgQk9HUiBvcmQsIGV2YWw9RiwgaW5jbHVkZT1GfQpCYWMuQk9HUi5rMS5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9MSwgbWF4aXQ9NTAwKQpCYWMuQk9HUi5rMi5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9MiwgbWF4aXQ9NTAwKQpCYWMuQk9HUi5rMy5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9MywgbWF4aXQ9NTAwKQpCYWMuQk9HUi5rNC5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9NCwgbWF4aXQ9NTAwKQpCYWMuQk9HUi5rNS5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9NSwgbWF4aXQ9NTAwKQpCYWMuQk9HUi5rNi5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9NiwgbWF4aXQ9NTAwKQpCYWMuQk9HUi5rNy5vcmQgPSBvcmRpbmF0ZShCYWMuQk9HUiwgIk5NRFMiLCAiYnJheSIsIGs9NywgbWF4aXQ9NTAwKQoKRnVuLkJPR1IuazEub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTEsIG1heGl0PTUwMCkKRnVuLkJPR1IuazIub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTIsIG1heGl0PTUwMCkKRnVuLkJPR1IuazMub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTMsIG1heGl0PTUwMCkKRnVuLkJPR1IuazQub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTQsIG1heGl0PTUwMCkKRnVuLkJPR1IuazUub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTUsIG1heGl0PTUwMCkKRnVuLkJPR1IuazYub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTYsIG1heGl0PTUwMCkKRnVuLkJPR1Iuazcub3JkID0gb3JkaW5hdGUoRnVuLkJPR1IsICJOTURTIiwgImJyYXkiLCBrPTcsIG1heGl0PTUwMCkKYGBgCgpgYGB7ciBCVURBIG9yZCwgZXZhbD1GLCBpbmNsdWRlPUZ9CkJhYy5CVURBLmsxLm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz0xLCBtYXhpdD01MDApCkJhYy5CVURBLmsyLm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz0yLCBtYXhpdD01MDApCkJhYy5CVURBLmszLm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz0zLCBtYXhpdD01MDApCkJhYy5CVURBLms0Lm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz00LCBtYXhpdD01MDApCkJhYy5CVURBLms1Lm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz01LCBtYXhpdD01MDApCkJhYy5CVURBLms2Lm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz02LCBtYXhpdD01MDApCkJhYy5CVURBLms3Lm9yZCA9IG9yZGluYXRlKEJhYy5CVURBLCAiTk1EUyIsICJicmF5Iiwgaz03LCBtYXhpdD01MDApCgpGdW4uQlVEQS5rMS5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9MSwgbWF4aXQ9NTAwKQpGdW4uQlVEQS5rMi5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9MiwgbWF4aXQ9NTAwKQpGdW4uQlVEQS5rMy5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9MywgbWF4aXQ9NTAwKQpGdW4uQlVEQS5rNC5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9NCwgbWF4aXQ9NTAwKQpGdW4uQlVEQS5rNS5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9NSwgbWF4aXQ9NTAwKQpGdW4uQlVEQS5rNi5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9NiwgbWF4aXQ9NTAwKQpGdW4uQlVEQS5rNy5vcmQgPSBvcmRpbmF0ZShGdW4uQlVEQSwgIk5NRFMiLCAiYnJheSIsIGs9NywgbWF4aXQ9NTAwKQpgYGAKCmBgYHtyIFNDU0Mgb3JkLCBldmFsPUYsIGluY2x1ZGU9Rn0KQmFjLlNDU0MuazEub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTEsIG1heGl0PTUwMCkKQmFjLlNDU0MuazIub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTIsIG1heGl0PTUwMCkKQmFjLlNDU0MuazMub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTMsIG1heGl0PTUwMCkKQmFjLlNDU0MuazQub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTQsIG1heGl0PTUwMCkKQmFjLlNDU0MuazUub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTUsIG1heGl0PTUwMCkKQmFjLlNDU0MuazYub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTYsIG1heGl0PTUwMCkKQmFjLlNDU0Muazcub3JkID0gb3JkaW5hdGUoQmFjLlNDU0MsICJOTURTIiwgImJyYXkiLCBrPTcsIG1heGl0PTUwMCkKCkZ1bi5TQ1NDLmsxLm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz0xLCBtYXhpdD01MDApCkZ1bi5TQ1NDLmsyLm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz0yLCBtYXhpdD01MDApCkZ1bi5TQ1NDLmszLm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz0zLCBtYXhpdD01MDApCkZ1bi5TQ1NDLms0Lm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz00LCBtYXhpdD01MDApCkZ1bi5TQ1NDLms1Lm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz01LCBtYXhpdD01MDApCkZ1bi5TQ1NDLms2Lm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz02LCBtYXhpdD01MDApCkZ1bi5TQ1NDLms3Lm9yZCA9IG9yZGluYXRlKEZ1bi5TQ1NDLCAiTk1EUyIsICJicmF5Iiwgaz03LCBtYXhpdD01MDApCmBgYAoKYGBge3IgbWFrZSBuYW1lIGxpc3Qgb2YgY29tbSBvcmRzLCBldmFsPVRSVUUsIGluY2x1ZGU9RkFMU0V9CiMgY29tbS5vcmQubmFtZXMuYnkuZ3Jhc3MgPC0gYygiQmFjLkFsbEcuazEub3JkIiwgIkJhYy5BbGxHLmsyLm9yZCIpCgpjb21tLm9yZC5uYW1lcy5ieS5ncmFzcyA8LSBjKCJCYWMuQWxsRy5rMS5vcmQiLCAiQmFjLkFsbEcuazIub3JkIiwgIkJhYy5BbGxHLmszLm9yZCIsICJCYWMuQWxsRy5rNC5vcmQiLCAiQmFjLkFsbEcuazUub3JkIiwgIkJhYy5BbGxHLms2Lm9yZCIsICJCYWMuQWxsRy5rNy5vcmQiLCAiQmFjLkFOR0UuazEub3JkIiwgIkJhYy5BTkdFLmsyLm9yZCIsICJCYWMuQU5HRS5rMy5vcmQiLCAiQmFjLkFOR0UuazQub3JkIiwgIkJhYy5BTkdFLms1Lm9yZCIsICJCYWMuQU5HRS5rNi5vcmQiLCAiQmFjLkFOR0Uuazcub3JkIiwgIkJhYy5CT0VSLmsxLm9yZCIsICJCYWMuQk9FUi5rMi5vcmQiLCAiQmFjLkJPRVIuazMub3JkIiwgIkJhYy5CT0VSLms0Lm9yZCIsICJCYWMuQk9FUi5rNS5vcmQiLCAiQmFjLkJPRVIuazYub3JkIiwgIkJhYy5CT0VSLms3Lm9yZCIsICJCYWMuQk9HUi5rMS5vcmQiLCAiQmFjLkJPR1IuazIub3JkIiwgIkJhYy5CT0dSLmszLm9yZCIsICJCYWMuQk9HUi5rNC5vcmQiLCAiQmFjLkJPR1IuazUub3JkIiwgIkJhYy5CT0dSLms2Lm9yZCIsICJCYWMuQk9HUi5rNy5vcmQiLCAiQmFjLkJVREEuazEub3JkIiwgIkJhYy5CVURBLmsyLm9yZCIsICJCYWMuQlVEQS5rMy5vcmQiLCAiQmFjLkJVREEuazQub3JkIiwgIkJhYy5CVURBLms1Lm9yZCIsICJCYWMuQlVEQS5rNi5vcmQiLCAiQmFjLkJVREEuazcub3JkIiwgIkJhYy5TQ1NDLmsxLm9yZCIsICJCYWMuU0NTQy5rMi5vcmQiLCAiQmFjLlNDU0MuazMub3JkIiwgIkJhYy5TQ1NDLms0Lm9yZCIsICJCYWMuU0NTQy5rNS5vcmQiLCAiQmFjLlNDU0MuazYub3JkIiwgIkJhYy5TQ1NDLms3Lm9yZCIsICJGdW4uQWxsRy5rMS5vcmQiLCAiRnVuLkFsbEcuazIub3JkIiwgIkZ1bi5BbGxHLmszLm9yZCIsICJGdW4uQWxsRy5rNC5vcmQiLCAiRnVuLkFsbEcuazUub3JkIiwgIkZ1bi5BbGxHLms2Lm9yZCIsICJGdW4uQWxsRy5rNy5vcmQiLCAiRnVuLkFOR0UuazEub3JkIiwgIkZ1bi5BTkdFLmsyLm9yZCIsICJGdW4uQU5HRS5rMy5vcmQiLCAiRnVuLkFOR0UuazQub3JkIiwgIkZ1bi5BTkdFLms1Lm9yZCIsICJGdW4uQU5HRS5rNi5vcmQiLCAiRnVuLkFOR0Uuazcub3JkIiwgIkZ1bi5CT0VSLmsxLm9yZCIsICJGdW4uQk9FUi5rMi5vcmQiLCAiRnVuLkJPRVIuazMub3JkIiwgIkZ1bi5CT0VSLms0Lm9yZCIsICJGdW4uQk9FUi5rNS5vcmQiLCAiRnVuLkJPRVIuazYub3JkIiwgIkZ1bi5CT0VSLms3Lm9yZCIsICJGdW4uQk9HUi5rMS5vcmQiLCAiRnVuLkJPR1IuazIub3JkIiwgIkZ1bi5CT0dSLmszLm9yZCIsICJGdW4uQk9HUi5rNC5vcmQiLCAiRnVuLkJPR1IuazUub3JkIiwgIkZ1bi5CT0dSLms2Lm9yZCIsICJGdW4uQk9HUi5rNy5vcmQiLCAiRnVuLkJVREEuazEub3JkIiwgIkZ1bi5CVURBLmsyLm9yZCIsICJGdW4uQlVEQS5rMy5vcmQiLCAiRnVuLkJVREEuazQub3JkIiwgIkZ1bi5CVURBLms1Lm9yZCIsICJGdW4uQlVEQS5rNi5vcmQiLCAiRnVuLkJVREEuazcub3JkIiwgIkZ1bi5TQ1NDLmsxLm9yZCIsICJGdW4uU0NTQy5rMi5vcmQiLCAiRnVuLlNDU0MuazMub3JkIiwgIkZ1bi5TQ1NDLms0Lm9yZCIsICJGdW4uU0NTQy5rNS5vcmQiLCAiRnVuLlNDU0MuazYub3JkIiwgIkZ1bi5TQ1NDLms3Lm9yZCIpCmBgYAoKXAoKIyMgUUMsIHN0cmVzcyBjaGVjayBhbmQgdmFsaWRhdGlvbiBvZiBvcmRpbmF0aW9ucyB7LnVubGlzdGVkfQoKYGBge3IgZXh0cmFjdC5ubWRzLmNoZWNrZml0LWZ1bmN0aW9uLCBpbmNsdWRlPUZ9CmV4dHJhY3Qubm1kcy5jaGVja2ZpdCA8LSBmdW5jdGlvbihvcmQub2JqZWN0LCAuLi4pIHsKICAKICBjaGVja2ZpdF92YWxzIDwtIG5tZHMuY2hlY2tmaXQob3JkLm9iamVjdCkKICAKICBpbnB1dC5uYW1lLnRvb29vby5sb25nIDwtIHByaW50KGFzLmNoYXJhY3RlcihuYW1lKSkgCiAgaW5wdXQubmFtZS5zaG9ydGVyIDwtIHNhcHBseShzdHJzcGxpdChpbnB1dC5uYW1lLnRvb29vby5sb25nLCAiLmsiKSwgIlsiLCAxKSAKICAKICBvdXQuZGYgPC0gZGF0YS5mcmFtZShuYW1lX29mX3JvdyA9IHBhc3RlMCgia18iLCBvcmQub2JqZWN0JG5kaW0pLAogICAgICAgICAgICAgICAgICAgICAgIGtfdmFsdWVzID0gb3JkLm9iamVjdCRuZGltLAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGEgPSBpbnB1dC5uYW1lLnNob3J0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyZXNzID0gY2hlY2tmaXRfdmFscyRzdHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgbm9ubWV0cmljLmZpdC5yMiA9IGNoZWNrZml0X3ZhbHMkbm9ubWV0cmljLmZpdC5yMiwKICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIuZml0LnIyID0gY2hlY2tmaXRfdmFscyRsaW5lYXIuZml0LnIyKQogIAogIGNsYXNzKG91dC5kZikgPC0gIm5tc2QuZ29mIgogIAogIG91dC5kZgp9CmBgYAoKYGBge3IgbWFrZSBjaGVja2ZpdCBkZiwgY2FjaGU9VFJVRSwgbWVzc2FnZT1GQUxTRSwgZXZhbD1GfQpvcmRfY2hlY2tmaXRfZGYgPSBkYXRhLmZyYW1lKCkKCmZvciAobmFtZSBpbiBjb21tLm9yZC5uYW1lcy5ieS5ncmFzcykgewogIAogIG91dHB1dCA9IGV4dHJhY3Qubm1kcy5jaGVja2ZpdChnZXQobmFtZSkpCgogIG9yZF9jaGVja2ZpdF9kZiA9IHJiaW5kKG9yZF9jaGVja2ZpdF9kZiwgb3V0cHV0KQoKfQoKYGBgCgpgYGB7ciBjaG9vc2UgayB2YWxzLCBldmFsPUZ9CiMgSWRlYWwgc3RyZXNzIHZhbHVlIGlzIDwgMC4wNSAoYnV0IGsgPiA1IG1ha2VzIGludGVycHJldGF0aW9uIGRpZmZpY3VsdCkKICAgICMgSGlnaGVyIHRoYW4gMC4yIGlzIHBvb3IgKHJpc2tzIGZvciBmYWxzZSBpbnRlcnByZXRhdGlvbikuCiAgICAjIDAuMSAtIDAuMiBpcyBmYWlyIChzb21lIGRpc3RhbmNlcyBjYW4gYmUgbWlzbGVhZGluZyBmb3IgaW50ZXJwcmV0YXRpb24pLgogICAgIyAwLjA1IC0gMC4xIGlzIGdvb2QgKGNhbiBiZSBjb25maWRlbnQgaW4gaW5mZXJlbmNlcyBmcm9tIHBsb3QpLgogICAgIyBMZXNzIHRoYW4gMC4wNSBpcyBleGNlbGxlbnQgKHRoaXMgY2FuIGJlIHJhcmUpLgoKCm9yZF9jaGVja2ZpdF9kZiRzdHJlc3M8LXJvdW5kKG9yZF9jaGVja2ZpdF9kZiRzdHJlc3MsMykKb3JkX2NoZWNrZml0X2RmJG5vbm1ldHJpYy5maXQucjI8LXJvdW5kKG9yZF9jaGVja2ZpdF9kZiRub25tZXRyaWMuZml0LnIyLDMpCm9yZF9jaGVja2ZpdF9kZiRsaW5lYXIuZml0LnIyPC1yb3VuZChvcmRfY2hlY2tmaXRfZGYkbGluZWFyLmZpdC5yMiwzKQoKCiMgRmluYWwgY2hvaWNlcyBvbiBrIHZhbHVlcwoKIyMgQWxsRwogIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMV0pCiAgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1syXSkKICAKICAjIGZsaXBwaW5nIHggYXhpcyBjb29yZHMgZm9yIGVhc2Ugb2YgaW50ZXJwcmV0YXRpb24KICAgICMgRnVuLkFsbEcuazUub3JkJHBvaW50c1ssMV08LUZ1bi5BbGxHLms1Lm9yZCRwb2ludHNbLDFdKi0xICMgYWxyZWFkeSBkb25lCiAgCiAgc2F2ZVJEUyhCYWMuQWxsRy5rNS5vcmQsIGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWMuQWxsRy5rNS5vcmQucmRzIikKICBzYXZlUkRTKEZ1bi5BbGxHLms1Lm9yZCwgZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0Z1bi5BbGxHLms1Lm9yZC5yZHMiKQoKIyMgQU5HRQogIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbM10pCiAgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1s0XSkKICAKICAjZmxpcCB4IGNvb3JkIG9mIElUUyBGdW4uQU5HRS5rNS5vcmQKICAgICAjIEZ1bi5BTkdFLms1Lm9yZCRwb2ludHNbLDFdPC1GdW4uQU5HRS5rNS5vcmQkcG9pbnRzWywxXSotMSAjIGFscmVhZHkgZG9uZQogIAogIHNhdmVSRFMoQmFjLkFOR0UuazUub3JkLCBmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvQmFjLkFOR0UuazUub3JkLnJkcyIpCiAgc2F2ZVJEUyhGdW4uQU5HRS5rNS5vcmQsIGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9GdW4uQU5HRS5rNS5vcmQucmRzIikKCiMjIEJPRVIKICBzYXZlUkRTKEJhYy5CT0VSLms1Lm9yZCwgZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0JhYy5CT0VSLms1Lm9yZC5yZHMiKQogIHNhdmVSRFMoRnVuLkJPRVIuazUub3JkLCBmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuLkJPRVIuazUub3JkLnJkcyIpCgojIyBCT0dSCiAgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1s3XSkKICBzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzhdKQogIAogIHNhdmVSRFMoQmFjLkJPR1IuazUub3JkLCBmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvQmFjLkJPR1IuazUub3JkLnJkcyIpCiAgc2F2ZVJEUyhGdW4uQk9HUi5rNS5vcmQsIGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9GdW4uQk9HUi5rNS5vcmQucmRzIikKCiMjIEJVREEKICBzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzldKQogIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMTBdKQogIAogICMgZmxpcHBpbmcgeSBheGlzIGNvb3JkcyBmb3IgZWFzZSBvZiBpbnRlcnByZXRhdGlvbgogICAgIyBGdW4uQlVEQS5rNi5vcmQkcG9pbnRzWywyXTwtRnVuLkJVREEuazYub3JkJHBvaW50c1ssMl0qLTEgIyBhbHJlYWR5IGRvbmUKICAKICBzYXZlUkRTKEJhYy5CVURBLms2Lm9yZCwgZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0JhYy5CVURBLms2Lm9yZC5yZHMiKQogIHNhdmVSRFMoRnVuLkJVREEuazYub3JkLCBmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuLkJVREEuazYub3JkLnJkcyIpCgojIyBTQ1NDCiAgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxMV0pCiAgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxMl0pCiAgCiAgc2F2ZVJEUyhCYWMuU0NTQy5rNS5vcmQsIGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWMuU0NTQy5rNS5vcmQucmRzIikKICBzYXZlUkRTKEZ1bi5TQ1NDLms1Lm9yZCwgZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0Z1bi5TQ1NDLms1Lm9yZC5yZHMiKQoKYGBgCgpgYGB7ciByZXN0b3JlIG9yZCBvYmplY3RzLCBldmFsPVQsIGluY2x1ZGU9RiwgY2FjaGU9VFJVRX0KQmFjLkFsbEcuazUub3JkIDwtIHJlYWRSRFMoZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0JhYy5BbGxHLms1Lm9yZC5yZHMiKQpGdW4uQWxsRy5rNS5vcmQgPC0gcmVhZFJEUyhmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuLkFsbEcuazUub3JkLnJkcyIpCgpCYWMuQU5HRS5rNS5vcmQgPC0gcmVhZFJEUyhmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvQmFjLkFOR0UuazUub3JkLnJkcyIpCkZ1bi5BTkdFLms1Lm9yZCA8LSByZWFkUkRTKGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9GdW4uQU5HRS5rNS5vcmQucmRzIikKCkJhYy5CT0VSLms1Lm9yZCA8LSByZWFkUkRTKGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWMuQk9FUi5rNS5vcmQucmRzIikKRnVuLkJPRVIuazUub3JkIDwtIHJlYWRSRFMoZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0Z1bi5CT0VSLms1Lm9yZC5yZHMiKQoKQmFjLkJPR1IuazUub3JkIDwtIHJlYWRSRFMoZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0JhYy5CT0dSLms1Lm9yZC5yZHMiKQpGdW4uQk9HUi5rNS5vcmQgPC0gcmVhZFJEUyhmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvRnVuLkJPR1IuazUub3JkLnJkcyIpCgpCYWMuQlVEQS5rNi5vcmQgPC0gcmVhZFJEUyhmaWxlPSIuLi9wcm9jZXNzZWRfZGF0YS9jbGVhbl9yZHNfc2F2ZXMvQmFjLkJVREEuazYub3JkLnJkcyIpCkZ1bi5CVURBLms2Lm9yZCA8LSByZWFkUkRTKGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9GdW4uQlVEQS5rNi5vcmQucmRzIikKCkJhYy5TQ1NDLms1Lm9yZCA8LSByZWFkUkRTKGZpbGU9Ii4uL3Byb2Nlc3NlZF9kYXRhL2NsZWFuX3Jkc19zYXZlcy9CYWMuU0NTQy5rNS5vcmQucmRzIikKRnVuLlNDU0MuazUub3JkIDwtIHJlYWRSRFMoZmlsZT0iLi4vcHJvY2Vzc2VkX2RhdGEvY2xlYW5fcmRzX3NhdmVzL0Z1bi5TQ1NDLms1Lm9yZC5yZHMiKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZ9Cmxpc3Qub3Jkb2JqZWN0Lm5hbWVzIDwtIGMoIkJhYy5BbGxHLms1Lm9yZCIsIkZ1bi5BbGxHLms1Lm9yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhYy5BTkdFLms1Lm9yZCIsIkZ1bi5BTkdFLms1Lm9yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhYy5CT0VSLms1Lm9yZCIsIkZ1bi5CT0VSLms1Lm9yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhYy5CT0dSLms1Lm9yZCIsIkZ1bi5CT0dSLms1Lm9yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhYy5CVURBLms2Lm9yZCIsIkZ1bi5CVURBLms2Lm9yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhYy5TQ1NDLms1Lm9yZCIsIkZ1bi5TQ1NDLms1Lm9yZCIpCmBgYAoKXAoKIyMgU2V0LXVwIG1ldGFkYXRhIHsudW5saXN0ZWR9CgpBdmFpbGFibGUgbWV0YWRhdGE6CgpgYGB7ciwgZWNobz1GLCBldmFsPVR9CnNkX0JhYzwtYXMuZGF0YS5mcmFtZShzYW1wbGVfZGF0YShCYWMpKQpjb2xuYW1lcyhzZF9CYWMpCmBgYAoKXAoKIyMgYWRvbmlzMiB0YWJsZXMgey51bmxpc3RlZCAudW5udW1iZXJlZCAuaGlkZGVufQoKIyMjIGJ5IGdyYXNzIHsudW5saXN0ZWQgLnVubnVtYmVyZWQgLmhpZGRlbn0KCmBgYHtyLCBldmFsPUYsIGluY2x1ZGU9Rn0KIyBjcmVhdGUgY29udGFpbmVyIGFycmF5IChkaW0gPSBjKG5yb3csIG5jb2wsIG5fZGYpKQphZG9uaXMub3V0X3ByZWRHcmFzcy5saXN0ID0gdmVjdG9yKCJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGNvbW0ubmFtZXMuYnkuZ3Jhc3NbMToyXSkpCgpmb3IgKGNvbW0gaW4gY29tbS5uYW1lcy5ieS5ncmFzc1sxOjJdKSB7CiAgYWRvbmlzLnRlbXBfcHJlZEdyYXNzIDwtIGFkb25pczIocGh5bG9zZXE6OmRpc3RhbmNlKGdldChjb21tKSwgbWV0aG9kPSJicmF5IikgfiBHcmFzcywgCiAgICAgICAgICBkYXRhID0gKGFzKHNhbXBsZV9kYXRhKGdldChjb21tKSksICJkYXRhLmZyYW1lIikpKQogIAogIGFkb25pcy50ZW1wX3ByZWRHcmFzcyRjb21tIDwtIGNvbW0gCiAgCiAgYWRvbmlzLm91dF9wcmVkR3Jhc3MubGlzdFtbY29tbV1dIDwtIChhcy5kYXRhLmZyYW1lKGFkb25pcy50ZW1wX3ByZWRHcmFzcykpCgogIH0KCmFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYXNzID0gZG8uY2FsbChyYmluZCwgYWRvbmlzLm91dF9wcmVkR3Jhc3MubGlzdCkKYGBgCgpcCgojIyMgYnkgQmluIHsudW5saXN0ZWQgLnVubnVtYmVyZWQgLmhpZGRlbn0KCmBgYHtyLCBldmFsPUYsIGluY2x1ZGU9Rn0KIyBjcmVhdGUgY29udGFpbmVyIGFycmF5IChkaW0gPSBjKG5yb3csIG5jb2wsIG5fZGYpKQphZG9uaXMub3V0X3ByZWRCaW4ubGlzdCA9IHZlY3RvcigibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChjb21tLm5hbWVzLmJ5LmdyYXNzKSkKCmZvciAoY29tbSBpbiBjb21tLm5hbWVzLmJ5LmdyYXNzKSB7CiAgYWRvbmlzLnRlbXBfcHJlZEJpbiA8LSBhZG9uaXMyKHBoeWxvc2VxOjpkaXN0YW5jZShnZXQoY29tbSksIG1ldGhvZD0iYnJheSIpIH4gQmluLCAKICAgICAgICAgIGRhdGEgPSAoYXMoc2FtcGxlX2RhdGEoZ2V0KGNvbW0pKSwgImRhdGEuZnJhbWUiKSkpCiAgCiAgYWRvbmlzLnRlbXBfcHJlZEJpbiRjb21tIDwtIGNvbW0gCiAgCiAgYWRvbmlzLm91dF9wcmVkQmluLmxpc3RbW2NvbW1dXSA8LSAoYXMuZGF0YS5mcmFtZShhZG9uaXMudGVtcF9wcmVkQmluKSkKCiAgfQoKYWRvbmlzLm91dC5hcnJheV9wcmVkQmluID0gZG8uY2FsbChyYmluZCwgYWRvbmlzLm91dF9wcmVkQmluLmxpc3QpCmBgYAoKIyMjIGJ5IEdyYWRpZW50IHsudW5saXN0ZWQgLnVubnVtYmVyZWQgLmhpZGRlbn0KCmBgYHtyLCBldmFsPUYsIGluY2x1ZGU9Rn0KIyBjcmVhdGUgY29udGFpbmVyIGFycmF5IChkaW0gPSBjKG5yb3csIG5jb2wsIG5fZGYpKQphZG9uaXMub3V0X3ByZWRHcmFkaWVudC5saXN0ID0gdmVjdG9yKCJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGNvbW0ubmFtZXMuYnkuZ3Jhc3MpKQoKIyBleGNsdWRpbmcgQk9FUiBiYyBpdCBvbmx5IG9jY3VycyBpbiBXZXN0Cgpmb3IgKGNvbW0gaW4gY29tbS5uYW1lcy5ieS5ncmFzc1tjKDE6NCw3OjEyKV0pIHsKICBhZG9uaXMudGVtcF9wcmVkR3JhZGllbnQgPC0gYWRvbmlzMihwaHlsb3NlcTo6ZGlzdGFuY2UoZ2V0KGNvbW0pLCBtZXRob2Q9ImJyYXkiKSB+IEdyYWRpZW50LCAKICAgICAgICAgIGRhdGEgPSAoYXMoc2FtcGxlX2RhdGEoZ2V0KGNvbW0pKSwgImRhdGEuZnJhbWUiKSkpCiAgCiAgYWRvbmlzLnRlbXBfcHJlZEdyYWRpZW50JGNvbW0gPC0gY29tbSAKICAKICBhZG9uaXMub3V0X3ByZWRHcmFkaWVudC5saXN0W1tjb21tXV0gPC0gKGFzLmRhdGEuZnJhbWUoYWRvbmlzLnRlbXBfcHJlZEdyYWRpZW50KSkKCiAgfQoKYWRvbmlzLm91dC5hcnJheV9wcmVkR3JhZGllbnQgPSBkby5jYWxsKHJiaW5kLCBhZG9uaXMub3V0X3ByZWRHcmFkaWVudC5saXN0KQpgYGAKClwKCiMjIyBzYXZlIGFkb25pczIgb3V0cHV0cyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQoKYGBge3IsIGV2YWw9RiwgaW5jbHVkZT1GfQpzYXZlUkRTKGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYXNzLCBmaWxlID0gJy4uL3Byb2Nlc3NlZF9kYXRhL2Fkb25pczIvYWRvbmlzLm91dC5hcnJheV9wcmVkR3Jhc3MucmRzJykKc2F2ZVJEUyhhZG9uaXMub3V0LmFycmF5X3ByZWRCaW4sIGZpbGUgPSAnLi4vcHJvY2Vzc2VkX2RhdGEvYWRvbmlzMi9hZG9uaXMub3V0LmFycmF5X3ByZWRCaW4ucmRzJykKc2F2ZVJEUyhhZG9uaXMub3V0LmFycmF5X3ByZWRHcmFkaWVudCwgZmlsZSA9ICcuLi9wcm9jZXNzZWRfZGF0YS9hZG9uaXMyL2Fkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LnJkcycpCmBgYAoKYGBge3IsIGluY2x1ZGU9RiwgZXZhbD1UUlVFfQphZG9uaXMub3V0LmFycmF5X3ByZWRHcmFzczwtcmVhZFJEUyhmaWxlID0gJy4uL3Byb2Nlc3NlZF9kYXRhL2Fkb25pczIvYWRvbmlzLm91dC5hcnJheV9wcmVkR3Jhc3MucmRzJykKYWRvbmlzLm91dC5hcnJheV9wcmVkQmluPC1yZWFkUkRTKGZpbGUgPSAnLi4vcHJvY2Vzc2VkX2RhdGEvYWRvbmlzMi9hZG9uaXMub3V0LmFycmF5X3ByZWRCaW4ucmRzJykKYWRvbmlzLm91dC5hcnJheV9wcmVkR3JhZGllbnQ8LXJlYWRSRFMoZmlsZSA9ICcuLi9wcm9jZXNzZWRfZGF0YS9hZG9uaXMyL2Fkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LnJkcycpCmBgYAoKIyMgR2VuZXJhdGUgcGxvdHMgZm9yIGxhdGVyIHZpZXdpbmcgey51bmxpc3RlZCAudW5udW1iZXJlZCAuaGlkZGVufQoKIyMjIGNvbG9yIGJ5IGdyYXNzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9CgpgYGB7ciBwbG90IG5tZHMgQWxsRyBjb2wgR3Jhc3MsIGluY2x1ZGU9RiwgZXZhbD1GfQpubWRzLkJhYy5BbGxHLmNvbEdyYXNzX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuQWxsRywgQmFjLkFsbEcuazUub3JkLCBjb2xvciA9ICJHcmFzcyIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmFjX2dyYXNzX2NvbHMsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkdyYXNzIEhvc3QiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGdndGl0bGUoIk5NRFMgYnkgR3Jhc3MgSG9zdCAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlMiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgbGVnZW5kLnRpdGxlICA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50ZXh0ICA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCmxlZ19ubWRzLmNvbEdyYXNzPC1nZXRfbGVnZW5kKG5tZHMuQmFjLkFsbEcuY29sR3Jhc3Nfd2xlZykKbm1kcy5CYWMuQWxsRy5jb2xHcmFzczwtbm1kcy5CYWMuQWxsRy5jb2xHcmFzc193bGVnK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpubWRzLkZ1bi5BbGxHLmNvbEdyYXNzPC1wbG90X29yZGluYXRpb24oRnVuLkFsbEcsIEZ1bi5BbGxHLms1Lm9yZCwgY29sb3IgPSAiR3Jhc3MiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGZ1bl9ncmFzc19jb2xzLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJHcmFzcyBIb3N0IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgbGFicyh5PSIiKSArCiAgZ2d0aXRsZSgiIiwgc3VidGl0bGUgPSAiSVRTIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpubWRzLkFsbEcuY29sR3Jhc3NfdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5BbGxHLmNvbEdyYXNzLG5tZHMuRnVuLkFsbEcuY29sR3Jhc3MsIG5jb2w9MikKcGxvdF9ncmlkKG5tZHMuQWxsRy5jb2xHcmFzc191cHBlcixsZWdfbm1kcy5jb2xHcmFzcywgbnJvdz0yLCByZWxfaGVpZ2h0cyA9IGMoMC44NSwwLjE1KSkKCmdnc2F2ZShmaWxlbmFtZSA9ICIuLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0FsbEdfY29sb3JHcmFzcy5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIAogICAgICAgZGV2aWNlID0gInBuZyIsIGhlaWdodCA9IDQsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQpgYGAKCiMjIyBjb2xvciBieSBiaW4gey51bmxpc3RlZCAudW5udW1iZXJlZH0KCmBgYHtyIHBsb3Qgbm1kcyBBbGxHIGNvbCBiaW4sIGluY2x1ZGU9RiwgZXZhbD1GfQoKbm1kcy5CYWMuQWxsRy5jb2xCaW5fd2xlZzwtcGxvdF9vcmRpbmF0aW9uKEJhYy5BbGxHLCBCYWMuQWxsRy5rNS5vcmQsIGNvbG9yID0gIkJpbiIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmFjX2Jpbl9jb2xzX241LAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJMYXRpdHVkaW5hbCBCaW4iKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGdndGl0bGUoIk5NRFMgYnkgTGF0aXR1ZGluYWwgQmluICg5MCUgY29uZmlkZW5jZSBsZXZlbCBmb3IgbXVsdGl2YXJpYXRlIHQtZGlzdHJpYnV0aW9uKSIsIHN1YnRpdGxlID0gIjE2UzogQWxsIEdyYXNzIEhvc3RzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xCaW48LWdldF9sZWdlbmQobm1kcy5CYWMuQWxsRy5jb2xCaW5fd2xlZykKbm1kcy5CYWMuQWxsRy5jb2xCaW48LW5tZHMuQmFjLkFsbEcuY29sQmluX3dsZWcrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCm5tZHMuRnVuLkFsbEcuY29sQmluPC1wbG90X29yZGluYXRpb24oRnVuLkFsbEcsIEZ1bi5BbGxHLms1Lm9yZCwgY29sb3IgPSAiQmluIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBmdW5fYmluX2NvbHNfbjUsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxhdGl0dWRpbmFsIEJpbiIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkgKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGxhYnMoeT0iIikgKwogIGdndGl0bGUoIiIsIHN1YnRpdGxlID0gIklUUzogQWxsIEdyYXNzIEhvc3RzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpubWRzLkFsbEcuY29sQmluX3VwcGVyPC1wbG90X2dyaWQobm1kcy5CYWMuQWxsRy5jb2xCaW4sbm1kcy5GdW4uQWxsRy5jb2xCaW4sIG5jb2w9MikKcGxvdF9ncmlkKG5tZHMuQWxsRy5jb2xCaW5fdXBwZXIsbGVnX25tZHMuY29sQmluLCBucm93PTIsIHJlbF9oZWlnaHRzID0gYygwLjg1LDAuMTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gIi4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfQWxsR19jb2xvckJpbi5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIAogICAgICAgZGV2aWNlID0gInBuZyIsIGhlaWdodCA9IDQsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQpgYGAKCmBgYHtyIHBsb3Qgbm1kcyBBTkdFIGNvbCBiaW4sIGluY2x1ZGU9RiwgZXZhbD1GfQoKICBCYWMuQU5HRS5rNC5vcmQKICBGdW4uQU5HRS5rNS5vcmQgIyA0LTcKCm5tZHMuQmFjLkFOR0UuY29sQmluX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuQU5HRSwgQmFjLkFOR0UuazUub3JkLCBjb2xvciA9ICJCaW4iKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJhY19iaW5fY29sc19uNSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTGF0aXR1ZGluYWwgQmluIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBnZ3RpdGxlKCJOTURTIGJ5IExhdGl0dWRpbmFsIEJpbiAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlM6IEdyYXNzIEhvc3QgPSBBTkdFIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xCaW48LWdldF9sZWdlbmQobm1kcy5CYWMuQU5HRS5jb2xCaW5fd2xlZykKbm1kcy5CYWMuQU5HRS5jb2xCaW48LW5tZHMuQmFjLkFOR0UuY29sQmluX3dsZWcrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCm5tZHMuRnVuLkFOR0UuY29sQmluPC1wbG90X29yZGluYXRpb24oRnVuLkFOR0UsIEZ1bi5BTkdFLms1Lm9yZCwgY29sb3IgPSAiQmluIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBmdW5fYmluX2NvbHNfbjUsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxhdGl0dWRpbmFsIEJpbiIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkgKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGxhYnMoeT0iIikgKwogIGdndGl0bGUoIiIsIHN1YnRpdGxlID0gIklUUzogR3Jhc3MgSG9zdCA9IEFOR0UiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCm5tZHMuQU5HRS5jb2xCaW5fdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5BTkdFLmNvbEJpbixubWRzLkZ1bi5BTkdFLmNvbEJpbiwgbmNvbD0yKQpwbG90X2dyaWQobm1kcy5BTkdFLmNvbEJpbl91cHBlcixsZWdfbm1kcy5jb2xCaW4sIG5yb3c9MiwgcmVsX2hlaWdodHMgPSBjKDAuODUsMC4xNSkpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19BTkdFX2NvbG9yQmluLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgCiAgICAgICBkZXZpY2UgPSAicG5nIiwgaGVpZ2h0ID0gNCwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpCmBgYAoKYGBge3IgcGxvdCBubWRzIEJPRVIgY29sIGJpbiwgaW5jbHVkZT1GLCBldmFsPUZ9CnN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbNV0pCnN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbNl0pCgpubWRzLkJhYy5CT0VSLmNvbEJpbl93bGVnPC1wbG90X29yZGluYXRpb24oQmFjLkJPRVIsIEJhYy5CT0VSLms1Lm9yZCwgY29sb3IgPSAiQmluIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBiYWNfYmluX2NvbHNfbjUsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxhdGl0dWRpbmFsIEJpbiIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkrCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgZ2d0aXRsZSgiTk1EUyBieSBMYXRpdHVkaW5hbCBCaW4gKDkwJSBjb25maWRlbmNlIGxldmVsIGZvciBtdWx0aXZhcmlhdGUgdC1kaXN0cmlidXRpb24pIiwgc3VidGl0bGUgPSAiMTZTOiBHcmFzcyBIb3N0ID0gQk9FUiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGl0bGUgID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgbGVnZW5kLnRleHQgID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIGxpbmV3aWR0aD0uNzUpCiAgKQoKbGVnX25tZHMuY29sQmluPC1nZXRfbGVnZW5kKG5tZHMuQmFjLkJPRVIuY29sQmluX3dsZWcpCm5tZHMuQmFjLkJPRVIuY29sQmluPC1ubWRzLkJhYy5CT0VSLmNvbEJpbl93bGVnK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpubWRzLkZ1bi5CT0VSLmNvbEJpbjwtcGxvdF9vcmRpbmF0aW9uKEZ1bi5CT0VSLCBGdW4uQk9FUi5rNS5vcmQsIGNvbG9yID0gIkJpbiIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZnVuX2Jpbl9jb2xzX241LAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJMYXRpdHVkaW5hbCBCaW4iKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpICsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBsYWJzKHk9IiIpICsKICBnZ3RpdGxlKCIiLCBzdWJ0aXRsZSA9ICJJVFM6IEdyYXNzIEhvc3QgPSBCT0VSIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpubWRzLkJPRVIuY29sQmluX3VwcGVyPC1wbG90X2dyaWQobm1kcy5CYWMuQk9FUi5jb2xCaW4sbm1kcy5GdW4uQk9FUi5jb2xCaW4sIG5jb2w9MikKcGxvdF9ncmlkKG5tZHMuQk9FUi5jb2xCaW5fdXBwZXIsbGVnX25tZHMuY29sQmluLCBucm93PTIsIHJlbF9oZWlnaHRzID0gYygwLjg1LDAuMTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gIi4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfQk9FUl9jb2xvckJpbi5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIAogICAgICAgZGV2aWNlID0gInBuZyIsIGhlaWdodCA9IDQsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQpgYGAKCmBgYHtyIHBsb3Qgbm1kcyBCT0dSIGNvbCBiaW4sIGluY2x1ZGU9RiwgZXZhbD1GfQpzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzddKQpzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzhdKQoKbm1kcy5CYWMuQk9HUi5jb2xCaW5fd2xlZzwtcGxvdF9vcmRpbmF0aW9uKEJhYy5CT0dSLCBCYWMuQk9HUi5rNS5vcmQsIGNvbG9yID0gIkJpbiIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmFjX2Jpbl9jb2xzX241LAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJMYXRpdHVkaW5hbCBCaW4iKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGdndGl0bGUoIk5NRFMgYnkgTGF0aXR1ZGluYWwgQmluICg5MCUgY29uZmlkZW5jZSBsZXZlbCBmb3IgbXVsdGl2YXJpYXRlIHQtZGlzdHJpYnV0aW9uKSIsIHN1YnRpdGxlID0gIjE2UzogR3Jhc3MgSG9zdCA9IEJPR1IiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgbGVnZW5kLnRpdGxlICA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50ZXh0ICA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCmxlZ19ubWRzLmNvbEJpbjwtZ2V0X2xlZ2VuZChubWRzLkJhYy5CT0dSLmNvbEJpbl93bGVnKQpubWRzLkJhYy5CT0dSLmNvbEJpbjwtbm1kcy5CYWMuQk9HUi5jb2xCaW5fd2xlZyt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKbm1kcy5GdW4uQk9HUi5jb2xCaW48LXBsb3Rfb3JkaW5hdGlvbihGdW4uQk9HUiwgRnVuLkJPR1IuazUub3JkLCBjb2xvciA9ICJCaW4iKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGZ1bl9iaW5fY29sc19uNSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTGF0aXR1ZGluYWwgQmluIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgbGFicyh5PSIiKSArCiAgZ2d0aXRsZSgiIiwgc3VidGl0bGUgPSAiSVRTOiBHcmFzcyBIb3N0ID0gQk9HUiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIGxpbmV3aWR0aD0uNzUpCiAgKQoKbm1kcy5CT0dSLmNvbEJpbl91cHBlcjwtcGxvdF9ncmlkKG5tZHMuQmFjLkJPR1IuY29sQmluLG5tZHMuRnVuLkJPR1IuY29sQmluLCBuY29sPTIpCnBsb3RfZ3JpZChubWRzLkJPR1IuY29sQmluX3VwcGVyLGxlZ19ubWRzLmNvbEJpbiwgbnJvdz0yLCByZWxfaGVpZ2h0cyA9IGMoMC44NSwwLjE1KSkKCmdnc2F2ZShmaWxlbmFtZSA9ICIuLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0JPR1JfY29sb3JCaW4ucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCAKICAgICAgIGRldmljZSA9ICJwbmciLCBoZWlnaHQgPSA0LCB3aWR0aCA9IDcsIHVuaXRzID0gImluIikKYGBgCgpgYGB7ciBwbG90IG5tZHMgQlVEQSBjb2wgYmluLCBpbmNsdWRlPUYsIGV2YWw9Rn0Kc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1s5XSkKc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxMF0pCgojZmxpcCB5IGNvb3JkIG9mIElUUyBGdW4uQlVEQS5rNi5vcmQKCm5tZHMuQmFjLkJVREEuY29sQmluX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuQlVEQSwgQmFjLkJVREEuazYub3JkLCBjb2xvciA9ICJCaW4iKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJhY19iaW5fY29sc19uNSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTGF0aXR1ZGluYWwgQmluIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBnZ3RpdGxlKCJOTURTIGJ5IExhdGl0dWRpbmFsIEJpbiAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlM6IEdyYXNzIEhvc3QgPSBCVURBIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xCaW48LWdldF9sZWdlbmQobm1kcy5CYWMuQlVEQS5jb2xCaW5fd2xlZykKbm1kcy5CYWMuQlVEQS5jb2xCaW48LW5tZHMuQmFjLkJVREEuY29sQmluX3dsZWcrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCm5tZHMuRnVuLkJVREEuY29sQmluPC1wbG90X29yZGluYXRpb24oRnVuLkJVREEsIEZ1bi5CVURBLms2Lm9yZCwgY29sb3IgPSAiQmluIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBmdW5fYmluX2NvbHNfbjUsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxhdGl0dWRpbmFsIEJpbiIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkgKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGxhYnMoeT0iIikgKwogIGdndGl0bGUoIiIsIHN1YnRpdGxlID0gIklUUzogR3Jhc3MgSG9zdCA9IEJVREEiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCm5tZHMuQlVEQS5jb2xCaW5fdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5CVURBLmNvbEJpbixubWRzLkZ1bi5CVURBLmNvbEJpbiwgbmNvbD0yKQpwbG90X2dyaWQobm1kcy5CVURBLmNvbEJpbl91cHBlcixsZWdfbm1kcy5jb2xCaW4sIG5yb3c9MiwgcmVsX2hlaWdodHMgPSBjKDAuODUsMC4xNSkpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19CVURBX2NvbG9yQmluLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgCiAgICAgICBkZXZpY2UgPSAicG5nIiwgaGVpZ2h0ID0gNCwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpCmBgYAoKYGBge3IgcGxvdCBubWRzIFNDU0MgY29sIGJpbiwgaW5jbHVkZT1GLCBldmFsPUZ9CnN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMTFdKQpzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzEyXSkKCm5tZHMuQmFjLlNDU0MuY29sQmluX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuU0NTQywgQmFjLlNDU0MuazUub3JkLCBjb2xvciA9ICJCaW4iKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJhY19iaW5fY29sc19uNSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTGF0aXR1ZGluYWwgQmluIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBnZ3RpdGxlKCJOTURTIGJ5IExhdGl0dWRpbmFsIEJpbiAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlM6IEdyYXNzIEhvc3QgPSBTQ1NDIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xCaW48LWdldF9sZWdlbmQobm1kcy5CYWMuU0NTQy5jb2xCaW5fd2xlZykKbm1kcy5CYWMuU0NTQy5jb2xCaW48LW5tZHMuQmFjLlNDU0MuY29sQmluX3dsZWcrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCm5tZHMuRnVuLlNDU0MuY29sQmluPC1wbG90X29yZGluYXRpb24oRnVuLlNDU0MsIEZ1bi5TQ1NDLms1Lm9yZCwgY29sb3IgPSAiQmluIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBmdW5fYmluX2NvbHNfbjUsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxhdGl0dWRpbmFsIEJpbiIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkgKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGxhYnMoeT0iIikgKwogIGdndGl0bGUoIiIsIHN1YnRpdGxlID0gIklUUzogR3Jhc3MgSG9zdCA9IFNDU0MiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCm5tZHMuU0NTQy5jb2xCaW5fdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5TQ1NDLmNvbEJpbixubWRzLkZ1bi5TQ1NDLmNvbEJpbiwgbmNvbD0yKQpwbG90X2dyaWQobm1kcy5TQ1NDLmNvbEJpbl91cHBlcixsZWdfbm1kcy5jb2xCaW4sIG5yb3c9MiwgcmVsX2hlaWdodHMgPSBjKDAuODUsMC4xNSkpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19TQ1NDX2NvbG9yQmluLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgCiAgICAgICBkZXZpY2UgPSAicG5nIiwgaGVpZ2h0ID0gNCwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpCmBgYAoKIyMjIGNvbG9yIGJ5IGdyYWRpZW50IHsudW5saXN0ZWQgLnVubnVtYmVyZWR9CgpgYGB7ciBwbG90IG5tZHMgQWxsRyBjb2wgR3JhZCwgaW5jbHVkZT1GLCBldmFsPUZ9CgpubWRzLkJhYy5BbGxHLmNvbEdyYWRfd2xlZzwtcGxvdF9vcmRpbmF0aW9uKEJhYy5BbGxHLCBCYWMuQWxsRy5rNS5vcmQsIGNvbG9yID0gIkdyYWRpZW50IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBiYWNfZ3JhZF9jb2xzX24zLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJMb25naXR1ZGluYWwgR3JhZGllbnQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGdndGl0bGUoIk5NRFMgYnkgTG9uZ2l0dWRpbmFsIEdyYWRpZW50ICg5MCUgY29uZmlkZW5jZSBsZXZlbCBmb3IgbXVsdGl2YXJpYXRlIHQtZGlzdHJpYnV0aW9uKSIsIHN1YnRpdGxlID0gIjE2UzogQWxsIEdyYXNzIEhvc3RzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xHcmFkPC1nZXRfbGVnZW5kKG5tZHMuQmFjLkFsbEcuY29sR3JhZF93bGVnKQpubWRzLkJhYy5BbGxHLmNvbEdyYWQ8LW5tZHMuQmFjLkFsbEcuY29sR3JhZF93bGVnK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpubWRzLkZ1bi5BbGxHLmNvbEdyYWQ8LXBsb3Rfb3JkaW5hdGlvbihGdW4uQWxsRywgRnVuLkFsbEcuazUub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZnVuX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgbGFicyh5PSIiKSArCiAgZ2d0aXRsZSgiIiwgc3VidGl0bGUgPSAiSVRTOiBBbGwgR3Jhc3MgSG9zdHMiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCm5tZHMuQWxsRy5jb2xHcmFkX3VwcGVyPC1wbG90X2dyaWQobm1kcy5CYWMuQWxsRy5jb2xHcmFkLG5tZHMuRnVuLkFsbEcuY29sR3JhZCwgbmNvbD0yKQpwbG90X2dyaWQobm1kcy5BbGxHLmNvbEdyYWRfdXBwZXIsbGVnX25tZHMuY29sR3JhZCwgbnJvdz0yLCByZWxfaGVpZ2h0cyA9IGMoMC44NSwwLjE1KSkKCmdnc2F2ZShmaWxlbmFtZSA9ICIuLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0FsbEdfY29sb3JHcmFkaWVudC5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIAogICAgICAgZGV2aWNlID0gInBuZyIsIGhlaWdodCA9IDQsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQpgYGAKCmBgYHtyIHBsb3Qgbm1kcyBBTkdFIGNvbCBHcmFkLCBpbmNsdWRlPUYsIGV2YWw9Rn0Kbm1kcy5CYWMuQU5HRS5jb2xHcmFkX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuQU5HRSwgQmFjLkFOR0UuazUub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmFjX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBnZ3RpdGxlKCJOTURTIGJ5IExvbmdpdHVkaW5hbCBHcmFkaWVudCAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlM6IEdyYXNzIEhvc3QgPSBBTkdFIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xHcmFkPC1nZXRfbGVnZW5kKG5tZHMuQmFjLkFOR0UuY29sR3JhZF93bGVnKQpubWRzLkJhYy5BTkdFLmNvbEdyYWQ8LW5tZHMuQmFjLkFOR0UuY29sR3JhZF93bGVnK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpubWRzLkZ1bi5BTkdFLmNvbEdyYWQ8LXBsb3Rfb3JkaW5hdGlvbihGdW4uQU5HRSwgRnVuLkFOR0UuazUub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZnVuX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgbGFicyh5PSIiKSArCiAgZ2d0aXRsZSgiIiwgc3VidGl0bGUgPSAiSVRTOiBHcmFzcyBIb3N0ID0gQU5HRSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIGxpbmV3aWR0aD0uNzUpCiAgKQoKbm1kcy5BTkdFLmNvbEdyYWRfdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5BTkdFLmNvbEdyYWQsbm1kcy5GdW4uQU5HRS5jb2xHcmFkLCBuY29sPTIpCnBsb3RfZ3JpZChubWRzLkFOR0UuY29sR3JhZF91cHBlcixsZWdfbm1kcy5jb2xHcmFkLCBucm93PTIsIHJlbF9oZWlnaHRzID0gYygwLjg1LDAuMTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gIi4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfQU5HRV9jb2xvckdyYWRpZW50LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgCiAgICAgICBkZXZpY2UgPSAicG5nIiwgaGVpZ2h0ID0gNCwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpCmBgYAoKYGBge3IgcGxvdCBubWRzIEJPRVIgY29sIEdyYWQsIGluY2x1ZGU9RiwgZXZhbD1GfQojIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbNV0pCiMgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1s2XSkKCm5tZHMuQmFjLkJPRVIuY29sR3JhZF93bGVnPC1wbG90X29yZGluYXRpb24oQmFjLkJPRVIsIEJhYy5CT0VSLms1Lm9yZCwgY29sb3IgPSAiR3JhZGllbnQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJhY19ncmFkX2NvbHNfbjMsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxvbmdpdHVkaW5hbCBHcmFkaWVudCIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkrCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgZ2d0aXRsZSgiTk1EUyBieSBMb25naXR1ZGluYWwgR3JhZGllbnQgKDkwJSBjb25maWRlbmNlIGxldmVsIGZvciBtdWx0aXZhcmlhdGUgdC1kaXN0cmlidXRpb24pIiwgc3VidGl0bGUgPSAiMTZTOiBHcmFzcyBIb3N0ID0gQk9FUiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGl0bGUgID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgbGVnZW5kLnRleHQgID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIGxpbmV3aWR0aD0uNzUpCiAgKQoKbGVnX25tZHMuY29sR3JhZDwtZ2V0X2xlZ2VuZChubWRzLkJhYy5CT0VSLmNvbEdyYWRfd2xlZykKbm1kcy5CYWMuQk9FUi5jb2xHcmFkPC1ubWRzLkJhYy5CT0VSLmNvbEdyYWRfd2xlZyt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKbm1kcy5GdW4uQk9FUi5jb2xHcmFkPC1wbG90X29yZGluYXRpb24oRnVuLkJPRVIsIEZ1bi5CT0VSLms1Lm9yZCwgY29sb3IgPSAiR3JhZGllbnQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGZ1bl9ncmFkX2NvbHNfbjMsCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkxvbmdpdHVkaW5hbCBHcmFkaWVudCIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOSkgKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGxhYnMoeT0iIikgKwogIGdndGl0bGUoIiIsIHN1YnRpdGxlID0gIklUUzogR3Jhc3MgSG9zdCA9IEJPRVIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCm5tZHMuQk9FUi5jb2xHcmFkX3VwcGVyPC1wbG90X2dyaWQobm1kcy5CYWMuQk9FUi5jb2xHcmFkLG5tZHMuRnVuLkJPRVIuY29sR3JhZCwgbmNvbD0yKQpwbG90X2dyaWQobm1kcy5CT0VSLmNvbEdyYWRfdXBwZXIsbGVnX25tZHMuY29sR3JhZCwgbnJvdz0yLCByZWxfaGVpZ2h0cyA9IGMoMC44NSwwLjE1KSkKCmdnc2F2ZShmaWxlbmFtZSA9ICIuLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0JPRVJfY29sb3JHcmFkaWVudC5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIAogICAgICAgZGV2aWNlID0gInBuZyIsIGhlaWdodCA9IDQsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQpgYGAKCmBgYHtyIHBsb3Qgbm1kcyBCT0dSIGNvbCBHcmFkLCBpbmNsdWRlPUYsIGV2YWw9Rn0KIyBzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzddKQojIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbOF0pCgpubWRzLkJhYy5CT0dSLmNvbEdyYWRfd2xlZzwtcGxvdF9vcmRpbmF0aW9uKEJhYy5CT0dSLCBCYWMuQk9HUi5rNS5vcmQsIGNvbG9yID0gIkdyYWRpZW50IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBiYWNfZ3JhZF9jb2xzX24zLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJMb25naXR1ZGluYWwgR3JhZGllbnQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpKwogIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiLCBsZXZlbCA9IDAuOSkgKwogIGdndGl0bGUoIk5NRFMgYnkgTG9uZ2l0dWRpbmFsIEdyYWRpZW50ICg5MCUgY29uZmlkZW5jZSBsZXZlbCBmb3IgbXVsdGl2YXJpYXRlIHQtZGlzdHJpYnV0aW9uKSIsIHN1YnRpdGxlID0gIjE2UzogR3Jhc3MgSG9zdCA9IEJPR1IiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgbGVnZW5kLnRpdGxlICA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50ZXh0ICA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBsaW5ld2lkdGg9Ljc1KQogICkKCmxlZ19ubWRzLmNvbEdyYWQ8LWdldF9sZWdlbmQobm1kcy5CYWMuQk9HUi5jb2xHcmFkX3dsZWcpCm5tZHMuQmFjLkJPR1IuY29sR3JhZDwtbm1kcy5CYWMuQk9HUi5jb2xHcmFkX3dsZWcrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCm5tZHMuRnVuLkJPR1IuY29sR3JhZDwtcGxvdF9vcmRpbmF0aW9uKEZ1bi5CT0dSLCBGdW4uQk9HUi5rNS5vcmQsIGNvbG9yID0gIkdyYWRpZW50IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBmdW5fZ3JhZF9jb2xzX24zLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJMb25naXR1ZGluYWwgR3JhZGllbnQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjkpICsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBsYWJzKHk9IiIpICsKICBnZ3RpdGxlKCIiLCBzdWJ0aXRsZSA9ICJJVFM6IEdyYXNzIEhvc3QgPSBCT0dSIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpubWRzLkJPR1IuY29sR3JhZF91cHBlcjwtcGxvdF9ncmlkKG5tZHMuQmFjLkJPR1IuY29sR3JhZCxubWRzLkZ1bi5CT0dSLmNvbEdyYWQsIG5jb2w9MikKcGxvdF9ncmlkKG5tZHMuQk9HUi5jb2xHcmFkX3VwcGVyLGxlZ19ubWRzLmNvbEdyYWQsIG5yb3c9MiwgcmVsX2hlaWdodHMgPSBjKDAuODUsMC4xNSkpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19CT0dSX2NvbG9yR3JhZGllbnQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCAKICAgICAgIGRldmljZSA9ICJwbmciLCBoZWlnaHQgPSA0LCB3aWR0aCA9IDcsIHVuaXRzID0gImluIikKYGBgCgpgYGB7ciBwbG90IG5tZHMgQlVEQSBjb2wgR3JhZCwgaW5jbHVkZT1GLCBldmFsPUZ9CiMgc3Vic2V0KG9yZF9jaGVja2ZpdF9kZixvcmRfY2hlY2tmaXRfZGYkaW5wdXRfZGF0YT09Y29tbS5uYW1lcy5ieS5ncmFzc1s5XSkKIyBzdWJzZXQob3JkX2NoZWNrZml0X2RmLG9yZF9jaGVja2ZpdF9kZiRpbnB1dF9kYXRhPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzEwXSkKCiNmbGlwIHkgY29vcmQgb2YgSVRTIEZ1bi5CVURBLms2Lm9yZAoKbm1kcy5CYWMuQlVEQS5jb2xHcmFkX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuQlVEQSwgQmFjLkJVREEuazYub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmFjX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBnZ3RpdGxlKCJOTURTIGJ5IExvbmdpdHVkaW5hbCBHcmFkaWVudCAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlM6IEdyYXNzIEhvc3QgPSBCVURBIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xHcmFkPC1nZXRfbGVnZW5kKG5tZHMuQmFjLkJVREEuY29sR3JhZF93bGVnKQpubWRzLkJhYy5CVURBLmNvbEdyYWQ8LW5tZHMuQmFjLkJVREEuY29sR3JhZF93bGVnK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpubWRzLkZ1bi5CVURBLmNvbEdyYWQ8LXBsb3Rfb3JkaW5hdGlvbihGdW4uQlVEQSwgRnVuLkJVREEuazYub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZnVuX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgbGFicyh5PSIiKSArCiAgZ2d0aXRsZSgiIiwgc3VidGl0bGUgPSAiSVRTOiBHcmFzcyBIb3N0ID0gQlVEQSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIGxpbmV3aWR0aD0uNzUpCiAgKQoKbm1kcy5CVURBLmNvbEdyYWRfdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5CVURBLmNvbEdyYWQsbm1kcy5GdW4uQlVEQS5jb2xHcmFkLCBuY29sPTIpCnBsb3RfZ3JpZChubWRzLkJVREEuY29sR3JhZF91cHBlcixsZWdfbm1kcy5jb2xHcmFkLCBucm93PTIsIHJlbF9oZWlnaHRzID0gYygwLjg1LDAuMTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gIi4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfQlVEQV9jb2xvckdyYWRpZW50LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgCiAgICAgICBkZXZpY2UgPSAicG5nIiwgaGVpZ2h0ID0gNCwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpCmBgYAoKYGBge3IgcGxvdCBubWRzIFNDU0MgY29sIEdyYWQsIGluY2x1ZGU9RiwgZXZhbD1GfQojIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMTFdKQojIHN1YnNldChvcmRfY2hlY2tmaXRfZGYsb3JkX2NoZWNrZml0X2RmJGlucHV0X2RhdGE9PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMTJdKQoKbm1kcy5CYWMuU0NTQy5jb2xHcmFkX3dsZWc8LXBsb3Rfb3JkaW5hdGlvbihCYWMuU0NTQywgQmFjLlNDU0MuazUub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmFjX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSsKICBzdGF0X2VsbGlwc2UodHlwZSA9ICJ0IiwgbGV2ZWwgPSAwLjkpICsKICBnZ3RpdGxlKCJOTURTIGJ5IExvbmdpdHVkaW5hbCBHcmFkaWVudCAoOTAlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIG11bHRpdmFyaWF0ZSB0LWRpc3RyaWJ1dGlvbikiLCBzdWJ0aXRsZSA9ICIxNlM6IEdyYXNzIEhvc3QgPSBTQ1NDIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpCiAgICAsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgIGxlZ2VuZC50aXRsZSAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCksCiAgICBsZWdlbmQudGV4dCAgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgbGluZXdpZHRoPS43NSkKICApCgpsZWdfbm1kcy5jb2xHcmFkPC1nZXRfbGVnZW5kKG5tZHMuQmFjLlNDU0MuY29sR3JhZF93bGVnKQpubWRzLkJhYy5TQ1NDLmNvbEdyYWQ8LW5tZHMuQmFjLlNDU0MuY29sR3JhZF93bGVnK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpubWRzLkZ1bi5TQ1NDLmNvbEdyYWQ8LXBsb3Rfb3JkaW5hdGlvbihGdW4uU0NTQywgRnVuLlNDU0MuazUub3JkLCBjb2xvciA9ICJHcmFkaWVudCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZnVuX2dyYWRfY29sc19uMywKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTG9uZ2l0dWRpbmFsIEdyYWRpZW50IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC45KSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIsIGxldmVsID0gMC45KSArCiAgbGFicyh5PSIiKSArCiAgZ2d0aXRsZSgiIiwgc3VidGl0bGUgPSAiSVRTOiBHcmFzcyBIb3N0ID0gU0NTQyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICAscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xMiksCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIGxpbmV3aWR0aD0uNzUpCiAgKQoKbm1kcy5TQ1NDLmNvbEdyYWRfdXBwZXI8LXBsb3RfZ3JpZChubWRzLkJhYy5TQ1NDLmNvbEdyYWQsbm1kcy5GdW4uU0NTQy5jb2xHcmFkLCBuY29sPTIpCnBsb3RfZ3JpZChubWRzLlNDU0MuY29sR3JhZF91cHBlcixsZWdfbm1kcy5jb2xHcmFkLCBucm93PTIsIHJlbF9oZWlnaHRzID0gYygwLjg1LDAuMTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gIi4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfU0NTQ19jb2xvckdyYWRpZW50LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgCiAgICAgICBkZXZpY2UgPSAicG5nIiwgaGVpZ2h0ID0gNCwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpCmBgYAoKIyBEYXRhIG92ZXJ2aWV3IHsudGFic2V0IC50YWJzZXQtcGlsbHN9CgpBbGwgRURHRSBzYW1wbGVzIGV4Y2x1ZGVkXApPVFUgdGFibGVzIHJhcmVmaWVkICgxNlM6IDksMDQ4ICYgSVRTOiAxMCwxMTYgc2Vxcy9zYW1wbGUpXAonVGF4YScgYXJlIE9UVXNcCgojIyBBbGxHIChBbGwgR3Jhc3Nlcykgey51bm51bWJlcmVkfQoKKipCYWN0ZXJpYWwgJiBBcmNoYWVhbCBEYXRhc2V0OioqCgpgYGB7cn0KQmFjLkFsbEcKYGBgCgpcCgoqKkZ1bmdhbCBEYXRhc2V0OioqCgpgYGB7cn0KRnVuLkFsbEcKYGBgCgpcCgojIyBBTkdFICgqQW5kcm9wb2dvbiBnZXJhcmRpaSogLyBCaWcgYmx1ZXN0ZW0pIHsudW5udW1iZXJlZH0KCioqQmFjdGVyaWFsICYgQXJjaGFlYWwgRGF0YXNldDoqKgoKYGBge3J9CkJhYy5BTkdFCmBgYAoKXAoKKipGdW5nYWwgRGF0YXNldDoqKgoKYGBge3J9CkZ1bi5BTkdFCmBgYAoKXAoKIyMgQk9FUiAoKkIuIGVyaW9wb2RhKiAvIEJsYWNrIGdyYW1hKSB7LnVubnVtYmVyZWR9CgoqKkJhY3RlcmlhbCAmIEFyY2hhZWFsIERhdGFzZXQ6KioKCmBgYHtyfQpCYWMuQk9FUgpgYGAKClwKCioqRnVuZ2FsIERhdGFzZXQ6KioKCmBgYHtyfQpGdW4uQk9FUgpgYGAKClwKCiMjIEJPR1IgKCpCLiBncmFjaWxpcyogLyBCbHVlIGdyYW1hKSB7LnVubnVtYmVyZWR9CgoqKkJhY3RlcmlhbCAmIEFyY2hhZWFsIERhdGFzZXQ6KioKCmBgYHtyfQpCYWMuQk9HUgpgYGAKClwKCioqRnVuZ2FsIERhdGFzZXQ6KioKCmBgYHtyfQpGdW4uQk9HUgpgYGAKClwKCiMjIEJVREEgKCpCb3V0ZWxvdWEgZGFjdHlsb2lkZXMqIC8gQnVmZmFsb2dyYXNzKSB7LnVubnVtYmVyZWR9CgoqKkJhY3RlcmlhbCAmIEFyY2hhZWFsIERhdGFzZXQ6KioKCmBgYHtyfQpCYWMuQlVEQQpgYGAKClwKCioqRnVuZ2FsIERhdGFzZXQ6KioKCmBgYHtyfQpGdW4uQlVEQQpgYGAKClwKCiMjIFNDU0MgKCpTY2hpemFjaHlyaXVtIHNjb3Bhcml1bSogLyBMaXR0bGUgYmx1ZXN0ZW0pIHsudW5udW1iZXJlZH0KCioqQmFjdGVyaWFsICYgQXJjaGFlYWwgRGF0YXNldDoqKgoKYGBge3J9CkJhYy5TQ1NDCmBgYAoKXAoKKipGdW5nYWwgRGF0YXNldDoqKgoKYGBge3J9CkZ1bi5TQ1NDCmBgYAoKXAoKIyBOTURTIEJ5IEdyYXNzIEhvc3QKClwKLSBBTkdFICgqQW5kcm9wb2dvbiBnZXJhcmRpaSogLyBCaWcgYmx1ZXN0ZW0pXAotIFNDU0MgKCpTY2hpemFjaHlyaXVtIHNjb3Bhcml1bSogLyBMaXR0bGUgYmx1ZXN0ZW0pXAotIEJPRVIgKCpCLiBlcmlvcG9kYSogLyBCbGFjayBncmFtYSlcCi0gQk9HUiAoKkIuIGdyYWNpbGlzKiAvIEJsdWUgZ3JhbWEpXAotIEJVREEgKCpCb3V0ZWxvdWEgZGFjdHlsb2lkZXMqIC8gQnVmZmFsb2dyYXNzKVwKXAoKIVtOTURTIHBsb3RzIG9mIGFsbCBzYW1wbGVzLCBjb2xvcmVkIGJ5IGdyYXNzIGhvc3RdKC4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfQWxsR19jb2xvckdyYXNzLnBuZyl7b3V0LndpZHRoPSI0MDBweCJ9CgpgYGB7ciwgY2FjaGU9VH0Ka25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRHcmFzcywgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxXSkpKVssMTo1XSwgInNpbXBsZSIsIAogICAgICAgICAgICAgZGlnaXRzID1jICgwLDEsMywyLDMpLCAKICAgICAgICAgICAgIGFsaWduID0gJ2MnKQoKa25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRHcmFzcywgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1syXSkpKVssMTo1XSwgInNpbXBsZSIsIAogICAgICAgICAgICAgZGlnaXRzID1jICgwLDEsMywyLDMpLCAKICAgICAgICAgICAgIGFsaWduID0gJ2MnKQoKYGBgCgojIFN1YnNldCBieSBHcmFzcyBIb3N0CgojIyBJbmZsdWVuY2Ugb2YgZGlzY3JldGUgbGF0aXR1ZGluYWwgYmlucyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQoKIyMjIEFsbEcgKEFsbCBHcmFzc2VzKSB7LnVubnVtYmVyZWR9CgohW05NRFMgcGxvdHMgb2YgYWxsIHNhbXBsZXMsIGNvbG9yZWQgYnkgbGF0aXR1ZGluYWwgYmluXSguLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0FsbEdfY29sb3JCaW4ucG5nKXtvdXQud2lkdGg9IjQwMHB4In0KCmBgYHtyLCBjYWNoZT1UfQprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEJpbiwgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxXSkpKVssMTo1XSwgInNpbXBsZSIsIAogICAgICAgICAgICAgZGlnaXRzID1jICgwLDEsMywyLDMpLCAKICAgICAgICAgICAgIGFsaWduID0gJ2MnKQoKa25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRCaW4sIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMl0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmBgYAoKIyMjIEFOR0UgKCpBbmRyb3BvZ29uIGdlcmFyZGlpKiAvIEJpZyBibHVlc3RlbSkgey51bm51bWJlcmVkfQoKIVtOTURTIHBsb3RzIG9mIEFOR0UgaG9zdC1hc3NvY2lhdGVkIHNhbXBsZXMsIGNvbG9yZWQgYnkgbGF0aXR1ZGluYWwgYmluXSguLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0FOR0VfY29sb3JCaW4ucG5nKXtvdXQuaGVpZ2h0PSI1MCUifQoKYGBge3IsIGNhY2hlPVQsIGV2YWw9VH0Ka25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRCaW4sIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbM10pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkQmluLCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzRdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgpgYGAKCiMjIyBCT0VSICgqQi4gZXJpb3BvZGEqIC8gQmxhY2sgZ3JhbWEpIHsudW5udW1iZXJlZH0KCiFbTk1EUyBwbG90cyBvZiBCT0VSIGhvc3QtYXNzb2NpYXRlZCBzYW1wbGVzLCBjb2xvcmVkIGJ5IGxhdGl0dWRpbmFsIGJpbl0oLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19CT0VSX2NvbG9yQmluLnBuZyl7b3V0LndpZHRoPSI0MDBweCJ9CgpgYGB7ciwgY2FjaGU9VH0Ka25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRCaW4sIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbNV0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkQmluLCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzZdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgpgYGAKCiMjIyBCT0dSICgqQi4gZ3JhY2lsaXMqIC8gQmx1ZSBncmFtYSkgey51bm51bWJlcmVkfQoKIVtOTURTIHBsb3RzIG9mIEJPR1IgaG9zdC1hc3NvY2lhdGVkIHNhbXBsZXMsIGNvbG9yZWQgYnkgbGF0aXR1ZGluYWwgYmluXSguLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0JPR1JfY29sb3JCaW4ucG5nKXtvdXQud2lkdGg9IjQwMHB4In0KCmBgYHtyLCBjYWNoZT1UfQprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEJpbiwgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1s3XSkpKVssMTo1XSwgInNpbXBsZSIsIAogICAgICAgICAgICAgZGlnaXRzID1jICgwLDEsMywyLDMpLCAKICAgICAgICAgICAgIGFsaWduID0gJ2MnKQoKa25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRCaW4sIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbOF0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmBgYAoKIyMjIEJVREEgKCpCb3V0ZWxvdWEgZGFjdHlsb2lkZXMqIC8gQnVmZmFsb2dyYXNzKSB7LnVubnVtYmVyZWR9CgohW05NRFMgcGxvdHMgb2YgQlVEQSBob3N0LWFzc29jaWF0ZWQgc2FtcGxlcywgY29sb3JlZCBieSBsYXRpdHVkaW5hbCBiaW5dKC4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfQlVEQV9jb2xvckJpbi5wbmcpe291dC53aWR0aD0iNDAwcHgifQoKYGBge3IsIGNhY2hlPVR9CmtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkQmluLCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzldKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEJpbiwgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxMF0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmBgYAoKIyMjIFNDU0MgKCpTY2hpemFjaHlyaXVtIHNjb3Bhcml1bSogLyBMaXR0bGUgYmx1ZXN0ZW0pIHsudW5udW1iZXJlZH0KCiFbTk1EUyBwbG90cyBvZiBTQ1NDIGhvc3QtYXNzb2NpYXRlZCBzYW1wbGVzLCBjb2xvcmVkIGJ5IGxhdGl0dWRpbmFsIGJpbl0oLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19TQ1NDX2NvbG9yQmluLnBuZyl7b3V0LndpZHRoPSI0MDBweCJ9CgpgYGB7ciwgY2FjaGU9VH0Ka25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRCaW4sIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMTFdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEJpbiwgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxMl0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmBgYAoKXAoKIyMgSW5mbHVlbmNlIG9mIGRpc2NyZXRlIGxvbmdpdHVkaW5hbCBncmFkaWVudHMgey50YWJzZXQgLnRhYnNldC1waWxsc30KCiMjIyBBbGxHIChBbGwgR3Jhc3Nlcykgey51bm51bWJlcmVkfQoKIVtOTURTIHBsb3RzIG9mIGFsbCBzYW1wbGVzLCBjb2xvcmVkIGJ5IGxvbmdpdHVkaW5hbCBncmFkaWVudF0oLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19BbGxHX2NvbG9yR3JhZGllbnQucG5nKXtvdXQud2lkdGg9IjYwMHB4In0KCmBgYHtyLCBjYWNoZT1UfQprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzFdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzJdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgpgYGAKCiMjIyBBTkdFICgqQW5kcm9wb2dvbiBnZXJhcmRpaSogLyBCaWcgYmx1ZXN0ZW0pIHsudW5udW1iZXJlZH0KCiFbTk1EUyBwbG90cyBvZiBBTkdFIGhvc3QtYXNzb2NpYXRlZCBzYW1wbGVzLCBjb2xvcmVkIGJ5IGxvbmdpdHVkaW5hbCBncmFkaWVudF0oLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19BTkdFX2NvbG9yR3JhZGllbnQucG5nKXtvdXQud2lkdGg9IjYwMHB4In0KCmBgYHtyLCBjYWNoZT1UfQprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzNdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzRdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCmBgYAoKIyMjIEJPRVIgKCpCLiBlcmlvcG9kYSogLyBCbGFjayBncmFtYSkgey51bm51bWJlcmVkfQoKIVtOTURTIHBsb3RzIG9mIEJPRVIgaG9zdC1hc3NvY2lhdGVkIHNhbXBsZXMsIGNvbG9yZWQgYnkgbG9uZ2l0dWRpbmFsIGdyYWRpZW50XSguLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0JPRVJfY29sb3JHcmFkaWVudC5wbmcpe291dC53aWR0aD0iNjAwcHgifVwKXApcClwKXApcClwKCjxwIGNsYXNzPSJ0ZXh0LWNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGFsaWNlYmx1ZSI+KipbTkEgb24gc3RhdHMgaGVyZSAtIG9ubHkgMSBmYWN0b3IgbGV2ZWxdKio8L3A+CgpcClwKXApcClwKXApcClwKXApcClwKCmBgYHtyLCBjYWNoZT1UfQojIGtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkR3JhZGllbnQsIAojICAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1s1XSkpKVssMTo1XSwgInNpbXBsZSIsIAojICAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAojICAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCiMga25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRHcmFkaWVudCwgCiMgICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzZdKSkpWywxOjVdLCAic2ltcGxlIiwgCiMgICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiMgICAgICAgICAgICAgIGFsaWduID0gJ2MnKQpgYGAKCiMjIyBCT0dSICgqQi4gZ3JhY2lsaXMqIC8gQmx1ZSBncmFtYSkgey51bm51bWJlcmVkfQoKIVtOTURTIHBsb3RzIG9mIEJPR1IgaG9zdC1hc3NvY2lhdGVkIHNhbXBsZXMsIGNvbG9yZWQgYnkgbG9uZ2l0dWRpbmFsIGdyYWRpZW50XSguLi9hbmFseXNlcy9vcmRpbmF0aW9ucy9OTURTX0JPR1JfY29sb3JHcmFkaWVudC5wbmcpe291dC53aWR0aD0iNjAwcHgifQoKYGBge3IsIGNhY2hlPVR9CmtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkR3JhZGllbnQsIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbN10pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkR3JhZGllbnQsIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbOF0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKYGBgCgojIyMgQlVEQSAoKkJvdXRlbG91YSBkYWN0eWxvaWRlcyogLyBCdWZmYWxvZ3Jhc3MpIHsudW5udW1iZXJlZH0KCiFbTk1EUyBwbG90cyBvZiBCVURBIGhvc3QtYXNzb2NpYXRlZCBzYW1wbGVzLCBjb2xvcmVkIGJ5IGxvbmdpdHVkaW5hbCBncmFkaWVudF0oLi4vYW5hbHlzZXMvb3JkaW5hdGlvbnMvTk1EU19CVURBX2NvbG9yR3JhZGllbnQucG5nKXtvdXQud2lkdGg9IjYwMHB4In0KCmBgYHtyLCBjYWNoZT1UfQprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzldKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCgprbml0cjo6a2FibGUoKGFzLmRhdGEuZnJhbWUoc3Vic2V0KGFkb25pcy5vdXQuYXJyYXlfcHJlZEdyYWRpZW50LCAKICAgICAgICAgICAgICAgICAgICBjb21tPT1jb21tLm5hbWVzLmJ5LmdyYXNzWzEwXSkpKVssMTo1XSwgInNpbXBsZSIsIAogICAgICAgICAgICAgZGlnaXRzID1jICgwLDEsMywyLDMpLCAKICAgICAgICAgICAgIGFsaWduID0gJ2MnKQpgYGAKCiMjIyBTQ1NDICgqU2NoaXphY2h5cml1bSBzY29wYXJpdW0qIC8gTGl0dGxlIGJsdWVzdGVtKSB7LnVubnVtYmVyZWR9CgohW05NRFMgcGxvdHMgb2YgU0NTQyBob3N0LWFzc29jaWF0ZWQgc2FtcGxlcywgY29sb3JlZCBieSBsb25naXR1ZGluYWwgZ3JhZGllbnRdKC4uL2FuYWx5c2VzL29yZGluYXRpb25zL05NRFNfU0NTQ19jb2xvckdyYWRpZW50LnBuZyl7b3V0LndpZHRoPSI2MDBweCJ9CgpgYGB7ciwgY2FjaGU9VH0Ka25pdHI6OmthYmxlKChhcy5kYXRhLmZyYW1lKHN1YnNldChhZG9uaXMub3V0LmFycmF5X3ByZWRHcmFkaWVudCwgCiAgICAgICAgICAgICAgICAgICAgY29tbT09Y29tbS5uYW1lcy5ieS5ncmFzc1sxMV0pKSlbLDE6NV0sICJzaW1wbGUiLCAKICAgICAgICAgICAgIGRpZ2l0cyA9YyAoMCwxLDMsMiwzKSwgCiAgICAgICAgICAgICBhbGlnbiA9ICdjJykKCmtuaXRyOjprYWJsZSgoYXMuZGF0YS5mcmFtZShzdWJzZXQoYWRvbmlzLm91dC5hcnJheV9wcmVkR3JhZGllbnQsIAogICAgICAgICAgICAgICAgICAgIGNvbW09PWNvbW0ubmFtZXMuYnkuZ3Jhc3NbMTJdKSkpWywxOjVdLCAic2ltcGxlIiwgCiAgICAgICAgICAgICBkaWdpdHMgPWMgKDAsMSwzLDIsMyksIAogICAgICAgICAgICAgYWxpZ24gPSAnYycpCmBgYAoKXAo=